home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue63 / Debug / HVBordebug / HVBorDebug.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-10-01  |  102.4 KB  |  3,250 lines

  1. unit HVBorDebug;
  2. {
  3.     Simplified class interface for the BorDebug API
  4.     Written by Hallvard Vassbotn (hallvard.vassbotn@c2i.net), April 1999 -
  5.     September 2000
  6.  
  7.     History:
  8.     15.04.99 HV Created
  9.     30.09.00 HV Updated and revised
  10. }
  11. interface
  12.  
  13. uses
  14.   Windows,
  15.   Classes,
  16.   TypInfo,
  17.   BorDebug,
  18.   SysUtils;
  19.  
  20. type
  21.   HVBorDebugError = class(Exception);
  22.   HVBorDebugIndexError = class(HVBorDebugError);
  23.   HVBorDebugSectionError = class(HVBorDebugError);
  24.  
  25.   // These are record types used to encapsulate the information transported
  26.   // between the BorDebug APIs without the overhead of creating proper
  27.   // class instances
  28.  
  29.   PBorDebugSubSection = ^TBorDebugSubSection;
  30.   TBorDebugSubSection = record
  31.     SubsectionType : TSubsectionType;
  32.     Module         : TModuleIndex;
  33.     Offset         : TFileOffset;
  34.     Size           : TByteCount;
  35.   end;
  36.  
  37.   PBorDebugModuleSegment = ^TBorDebugModuleSegment;
  38.   TBorDebugModuleSegment = record
  39.     LinkerSegment : TLinkerSegmentIndex;
  40.     Offset        : TFileOffset;
  41.     Size          : TByteCount;
  42.     Flags         : TSegmentFlags;
  43.   end;
  44.  
  45.   PBorDebugSymbol = ^TBorDebugSymbol;
  46.   TBorDebugSymbol = record
  47.     Kind          : TSymbolKind;
  48.     Offset        : TFileOffset;
  49.     Len           : TByteCount;
  50.   end;
  51.  
  52.   PBorDebugType = ^TBorDebugType;
  53.   TBorDebugType = record
  54.     TypeIndex     : TTypeIndex;
  55.     TypeOffset    : TFileOffset;
  56.     Length        : TByteCount;
  57.     TypeKind      : TTypeKind;
  58.   end;
  59.  
  60.   PBorDebugGlobalSymbol = ^TBorDebugGlobalSymbol;
  61.   TBorDebugGlobalSymbol = record
  62.     SymHashFunction     : TNameIndex;
  63.     AddrHashFunction    : TNameIndex;
  64.     SymTableBytes       : TByteCount;
  65.     SymHashTableBytes   : TByteCount;
  66.     AddrHashTableBytes  : TByteCount;
  67.     TotalUDTs           : TItemCount;
  68.     TotalOtherSyms      : TItemCount;
  69.     TotalSymbols        : TItemCount;
  70.     TotalNameSpaces     : TItemCount;
  71.   end;
  72.  
  73.   PCOMPILESymbolRec = ^TCOMPILESymbolRec;
  74.   TCOMPILESymbolRec = record
  75.     Machine                  : TProcessorID;
  76.     Language                 : TLanguageID;
  77.     Flags                    : TCompileSymbolFlags;
  78.     CompilerName             : PChar;
  79.   end;
  80.   PREGISTERSymbolRec = ^TREGISTERSymbolRec;
  81.   TREGISTERSymbolRec = record
  82.     TypeIndex                : TTypeIndex;
  83.     RegisterIndex            : TRegisterIndex;
  84.     NameIndex                : TNameIndex;
  85.     BrowserOffset            : TFileOffset;
  86.   end;
  87.   PCONSTSymbolRec = ^TCONSTSymbolRec;
  88.   TCONSTSymbolRec = record
  89.     TypeIndex                : TTypeIndex;
  90.     NameIndex                : TNameIndex;
  91.     BrowserOffset            : TFileOffset;
  92.     Value                    : TConstValue;
  93.   end;
  94.   PUDTSymbolRec = ^TUDTSymbolRec;
  95.   TUDTSymbolRec = record
  96.     TypeIndex                : TTypeIndex;
  97.     Properties               : TUDTFlags;
  98.     NameIndex                : TNameIndex;
  99.     BrowserOffset            : TFileOffset;
  100.   end;
  101.   PSSEARCHSymbolRec = ^TSSEARCHSymbolRec;
  102.   TSSEARCHSymbolRec = record
  103.     FirstProcSegment         : TSegmentIndex;
  104.     FirstProcOffset          : TSegmentOffset;
  105.     CodeSymCount             : TItemCount;
  106.     DataSymCount             : TItemCount;
  107.     FirstData                : TFileOffsetDelta;
  108.   end;  
  109.   POBJNAMESymbolRec = ^TOBJNAMESymbolRec;
  110.   TOBJNAMESymbolRec = record
  111.     Signature                : TSignature;
  112.     NameIndex                : TNameIndex;
  113.   end;
  114.   PGPROCREFSymbolRec = ^TGPROCREFSymbolRec;
  115.   TGPROCREFSymbolRec = record
  116.     RefSymOffset             : TFileOffset;
  117.     TypeIndex                : TTypeIndex;
  118.     NameIndex                : TNameIndex;
  119.     BrowserOffset            : TFileOffset;
  120.     CodeSegment              : TSegmentIndex;
  121.     CodeOffset               : TSegmentOffset;
  122.   end;
  123.   PGDATAREFSymbolRec = ^TGDATAREFSymbolRec;
  124.   TGDATAREFSymbolRec = record
  125.     RefSymOffset             : TFileOffset;
  126.     TypeIndex                : TTypeIndex;
  127.     NameIndex                : TNameIndex;
  128.     BrowserOffset            : TFileOffset;
  129.     DataSegment              : TSegmentIndex;
  130.     DataOffset               : TSegmentOffset;
  131.   end;  
  132.   PEDATASymbolRec = ^TEDATASymbolRec;
  133.   TEDATASymbolRec = record
  134.     TypeIndex                : TTypeIndex;
  135.     NameIndex                : TNameIndex;
  136.     ExternIndex              : TExternIndex;
  137.     Flags                    : TSymbolFlags;
  138.     BrowserOffset            : TFileOffset;
  139.   end;
  140.   PEPROCSymbolRec = ^TEPROCSymbolRec;
  141.   TEPROCSymbolRec = record
  142.     TypeIndex                : TTypeIndex;
  143.     NameIndex                : TNameIndex;
  144.     ExternIndex              : TExternIndex;
  145.     Flags                    : TSymbolFlags;
  146.     BrowserOffset            : TFileOffset;
  147.   end;
  148.   PUSESSymbolRec = ^TUSESSymbolRec;
  149.   TUSESSymbolRec = record
  150.     NameCount                : TItemCount;
  151.     NameIndices              : PNameIndices;
  152.   end;                           
  153.   PNAMESPACESymbolRec = ^TNAMESPACESymbolRec;
  154.   TNAMESPACESymbolRec = record
  155.     UsingCount               : TItemCount;
  156.     NameIndex                : TNameIndex;
  157.     BrowserOffset            : TFileOffset;
  158.     UsingIndices             : PNameIndices
  159.   end;
  160.   PUSINGSymbolRec = ^TUSINGSymbolRec;
  161.   TUSINGSymbolRec = record
  162.     NameCount                : TItemCount;
  163.     NameIndices              : PNameIndices;
  164.   end;
  165.   PPCONSTANTSymbolRec = ^TPCONSTANTSymbolRec;
  166.   TPCONSTANTSymbolRec = record
  167.     TypeIndex                : TTypeIndex;
  168.     NameIndex                : TNameIndex;
  169.     Properties               : TPascalConstantProperties;
  170.     BrowserOffset            : TFileOffset;
  171.     ValueLen                 : TByteCount;
  172.     Value                    : PChar;
  173.   end;
  174.   PBPREL32SymbolRec = ^TBPREL32SymbolRec;
  175.   TBPREL32SymbolRec = record
  176.     EBPOffset                : TEBPOffset;
  177.     TypeIndex                : TTypeIndex;
  178.     NameIndex                : TNameIndex;
  179.     BrowserOffset            : TFileOffset;
  180.   end;
  181.   PLDATA32SymbolRec = ^TLDATA32SymbolRec;
  182.   TLDATA32SymbolRec = record
  183.     Offset                   : TSegmentOffset;
  184.     Segment                  : TSegmentIndex;
  185.     Flags                    : TSymbolFlags;
  186.     TypeIndex                : TTypeIndex;
  187.     NameIndex                : TNameIndex;
  188.     BrowserOffset            : TFileOffset;
  189.   end;
  190.   PGDATA32SymbolRec = ^TGDATA32SymbolRec;
  191.   TGDATA32SymbolRec = record
  192.     Offset                   : TSegmentOffset;
  193.     Segment                  : TSegmentIndex;
  194.     Flags                    : TSymbolFlags;
  195.     TypeIndex                : TTypeIndex;
  196.     NameIndex                : TNameIndex;
  197.     BrowserOffset            : TFileOffset;
  198.   end;  
  199.   PPUB32SymbolRec = ^TPUB32SymbolRec;
  200.   TPUB32SymbolRec = record
  201.     Offset                   : TSegmentOffset;
  202.     Segment                  : TSegmentIndex;
  203.     Flags                    : TSymbolFlags;
  204.     TypeIndex                : TTypeIndex;
  205.     NameIndex                : TNameIndex;
  206.     BrowserOffset            : TFileOffset;
  207.   end;  
  208.   PLPROC32SymbolRec = ^TLPROC32SymbolRec;
  209.   TLPROC32SymbolRec = record
  210.     Parent                   : TSubsectionDelta;
  211.     End_                     : TSubsectionDelta;
  212.     Next                     : TSubsectionDelta;
  213.     CodeLength               : TByteCount;
  214.     DebugStart               : TFileOffset;
  215.     DebugEnd                 : TFileOffset;
  216.     Offset                   : TSegmentOffset;
  217.     Segment                  : TSegmentIndex;
  218.     Flags                    : DWORD;
  219.     TypeIndex                : TTypeIndex;
  220.     NameIndex                : TNameIndex;
  221.     BrowserOffset            : TFileOffset;
  222.   end;
  223.   PGPROC32SymbolRec = ^TGPROC32SymbolRec;
  224.   TGPROC32SymbolRec = record
  225.     Parent                   : TSubsectionDelta;
  226.     End_                     : TSubsectionDelta;
  227.     Next                     : TSubsectionDelta;
  228.     CodeLength               : TByteCount;
  229.     DebugStart               : TFileOffset;
  230.     DebugEnd                 : TFileOffset;
  231.     Offset                   : TSegmentOffset;
  232.     Segment                  : TSegmentIndex;
  233.     Flags                    : DWORD;
  234.     TypeIndex                : TTypeIndex;
  235.     NameIndex                : TNameIndex;
  236.     BrowserOffset            : TFileOffset;
  237.     LinkName                 : PChar;
  238.     LinkNameLen              : TByteCount
  239.   end;
  240.   PTHUNK32SymbolRec = ^TTHUNK32SymbolRec;
  241.   TTHUNK32SymbolRec = record
  242.     Parent                   : TSubsectionDelta;
  243.     End_                     : TSubsectionDelta;
  244.     Next                     : TSubsectionDelta;
  245.     Offset                   : TSegmentOffset;
  246.     Segment                  : TSegmentIndex;
  247.     CodeLength               : TByteCount;
  248.     Ordinal                  : TThunkOrdinal;
  249.     NameIndex                : TNameIndex;
  250.     Delta                    : TByteCount;
  251.   end;
  252.   PBLOCK32SymbolRec = ^TBLOCK32SymbolRec;
  253.   TBLOCK32SymbolRec = record
  254.     Parent                   : TSubsectionDelta;
  255.     End_                     : TSubsectionDelta;
  256.     CodeLength               : TByteCount;
  257.     Offset                   : TSegmentOffset;
  258.     Segment                  : TSegmentIndex;
  259.     NameIndex                : TNameIndex;
  260.   end;
  261.   PWITH32SymbolRec = ^TWITH32SymbolRec;
  262.   TWITH32SymbolRec = record
  263.     Parent                   : TSubsectionDelta;
  264.     CodeLength               : TByteCount;
  265.     Offset                   : TSegmentOffset;
  266.     Segment                  : TSegmentIndex;
  267.     Flags                    : DWORD;
  268.     TypeIndex                : TTypeIndex;
  269.     NameIndex                : TNameIndex;
  270.     VarOffset                : TByteOffset;
  271.   end;  
  272.   PLABEL32SymbolRec = ^TLABEL32SymbolRec;
  273.   TLABEL32SymbolRec = record
  274.     Offset                   : TSegmentOffset;
  275.     Segment                  : TSegmentIndex;
  276.     NearFar                  : TNearFar;
  277.     NameIndex                : TNameIndex;
  278.   end;
  279.   PENTRY32SymbolRec = ^TENTRY32SymbolRec;
  280.   TENTRY32SymbolRec = record
  281.     Offset                   : TSegmentOffset;
  282.     Segment                  : TSegmentIndex;
  283.   end;
  284.   POPTVAR32SymbolRec = ^TOPTVAR32SymbolRec;
  285.   TOPTVAR32SymbolRec = record
  286.     EntryCount               : TItemCount;
  287.     StartEntries             : PSegmentOffsets;  // or nil
  288.     LengthEntries            : PByteCounts;      // or nil
  289.     RegNameEntries           : PRegNameIndices
  290.   end;
  291.   PPROCRET32SymbolRec = ^TPROCRET32SymbolRec;
  292.   TPROCRET32SymbolRec = record
  293.     Offset                   : TSegmentOffset;
  294.     Length                   : TByteCount;
  295.   end;
  296.   PSAVREGS32SymbolRec = ^TSAVREGS32SymbolRec;
  297.   TSAVREGS32SymbolRec = record
  298.     Mask                     : TSaveRegs;
  299.     EBPOffset                : TEBPOffset;
  300.   end;
  301.   PSLINK32SymbolRec = ^TSLINK32SymbolRec;
  302.   TSLINK32SymbolRec = record
  303.     EBPOffset : TEBPOffset;
  304.   end;
  305.  
  306.   PSymbolInfoRec = ^TSymbolInfoRec;
  307.   TSymbolInfoRec = record
  308.     Symbol : TBorDebugSymbol;
  309.     case TSymbolKind of
  310.       0                    : (SymbolPtr      : Pointer            );
  311.       BORDEBUG_S_COMPILE   : (COMPILESymbol  : PCOMPILESymbolRec  );
  312.       BORDEBUG_S_REGISTER  : (REGISTERSymbol : PREGISTERSymbolRec );
  313.       BORDEBUG_S_CONST     : (CONSTSymbol    : PCONSTSymbolRec    );
  314.       BORDEBUG_S_UDT       : (UDTSymbol      : PUDTSymbolRec      );
  315.       BORDEBUG_S_SSEARCH   : (SSEARCHSymbol  : PSSEARCHSymbolRec  );
  316.       BORDEBUG_S_OBJNAME   : (OBJNAMESymbol  : POBJNAMESymbolRec  );
  317.       BORDEBUG_S_GPROCREF  : (GPROCREFSymbol : PGPROCREFSymbolRec );
  318.       BORDEBUG_S_GDATAREF  : (GDATAREFSymbol : PGDATAREFSymbolRec );
  319.       BORDEBUG_S_EDATA     : (EDATASymbol    : PEDATASymbolRec    );
  320.       BORDEBUG_S_EPROC     : (EPROCSymbol    : PEPROCSymbolRec    );
  321.       BORDEBUG_S_USES      : (USESSymbol     : PUSESSymbolRec     );
  322.       BORDEBUG_S_NAMESPACE : (NAMESPACESymbol: PNAMESPACESymbolRec);
  323.       BORDEBUG_S_USING     : (USINGSymbol    : PUSINGSymbolRec    );
  324.       BORDEBUG_S_PCONSTANT : (PCONSTANTSymbol: PPCONSTANTSymbolRec);
  325.       BORDEBUG_S_BPREL32   : (BPREL32Symbol  : PBPREL32SymbolRec  );
  326.       BORDEBUG_S_LDATA32   : (LDATA32Symbol  : PLDATA32SymbolRec  );
  327.       BORDEBUG_S_GDATA32   : (GDATA32Symbol  : PGDATA32SymbolRec  );
  328.       BORDEBUG_S_PUB32     : (PUB32Symbol    : PPUB32SymbolRec    );
  329.       BORDEBUG_S_LPROC32   : (LPROC32Symbol  : PLPROC32SymbolRec  );
  330.       BORDEBUG_S_GPROC32   : (GPROC32Symbol  : PGPROC32SymbolRec  );
  331.       BORDEBUG_S_THUNK32   : (THUNK32Symbol  : PTHUNK32SymbolRec  );
  332.       BORDEBUG_S_BLOCK32   : (BLOCK32Symbol  : PBLOCK32SymbolRec  );
  333.       BORDEBUG_S_WITH32    : (WITH32Symbol   : PWITH32SymbolRec   );
  334.       BORDEBUG_S_LABEL32   : (LABEL32Symbol  : PLABEL32SymbolRec  );
  335.       BORDEBUG_S_ENTRY32   : (ENTRY32Symbol  : PENTRY32SymbolRec  );
  336.       BORDEBUG_S_OPTVAR32  : (OPTVAR32Symbol : POPTVAR32SymbolRec );
  337.       BORDEBUG_S_PROCRET32 : (PROCRET32Symbol: PPROCRET32SymbolRec);
  338.       BORDEBUG_S_SAVREGS32 : (SAVREGS32Symbol: PSAVREGS32SymbolRec);
  339.       BORDEBUG_S_SLINK32   : (SLINK32Symbol  : PSLINK32SymbolRec  );
  340.   end;
  341.  
  342.   PMODIFIERTypeRec = ^TMODIFIERTypeRec;
  343.   TMODIFIERTypeRec = record
  344.      Attributes               : TTypeModifierAttr;
  345.      TypeIndex                : TTypeIndex;
  346.   end;
  347.   PPOINTERTypeRec = ^TPOINTERTypeRec;
  348.   TPOINTERTypeRec = record
  349.      Attributes               : TTypePointerAttr;
  350.      TypeIndex                : TTypeIndex;
  351.      Value1                   : TTypePointerValue1;
  352.      Value2                   : TTypePointerValue2;
  353.   end;
  354.   PARRAYTypeRec = ^TARRAYTypeRec;
  355.   TARRAYTypeRec = record
  356.      ElementType              : TTypeIndex;
  357.      IndexType                : TTypeIndex;
  358.      NameIndex                : TNameIndex;
  359.      Size                     : TByteCount;
  360.      Elements                 : TItemCount;
  361.   end;
  362.   PCLASSTypeRec = ^TCLASSTypeRec;
  363.   TCLASSTypeRec = record
  364.      FieldCount               : TItemCount;
  365.      FieldList                : TTypeIndex;
  366.      ClassFlags               : TClassFlags;
  367.      ContainingClass          : TTypeIndex;
  368.      DerivationList           : TTypeIndex;
  369.      Vtable                   : TTypeIndex;
  370.      NameIndex                : TNameIndex;
  371.      ClassSize                : TByteCount;
  372.   end;
  373.   PUNIONTypeRec = ^TUNIONTypeRec;
  374.   TUNIONTypeRec = record
  375.      FieldCount               : TItemCount;
  376.      FieldList                : TTypeIndex;
  377.      ClassFlags               : TClassFlags;
  378.      ContainingClass          : TTypeIndex;
  379.      NameIndex                : TNameIndex;
  380.      ClassSize                : TByteCount;
  381.   end;
  382.   PENUMTypeRec = ^TENUMTypeRec;
  383.   TENUMTypeRec = record
  384.      MemberCount              : TItemCount;
  385.      UnderlyingType           : TTypeIndex;
  386.      MemberList               : TTypeIndex;
  387.      ContainingClass          : TTypeIndex;
  388.      NameIndex                : TNameIndex;
  389.   end;
  390.   PPROCEDURETypeRec = ^TPROCEDURETypeRec;
  391.   TPROCEDURETypeRec = record
  392.      ReturnType               : TTypeIndex;
  393.      CallingConvention        : TCallingConvention;
  394.      ArgCount                 : TItemCount;
  395.      ArgList                  : TTypeIndex;
  396.   end;
  397.   PMFUNCTIONTypeRec = ^TMFUNCTIONTypeRec;
  398.   TMFUNCTIONTypeRec = record
  399.      ReturnType               : TTypeIndex;
  400.      ClassType                : TTypeIndex;
  401.      ThisType                 : TTypeIndex;
  402.      CallingConvention        : TCallingConvention;
  403.      ArgCount                 : TItemCount;
  404.      ArgList                  : TTypeIndex;
  405.      ThisAdjust               : TSegmentOffset {?};
  406.   end;
  407.   PVTSHAPETypeRec = ^TVTSHAPETypeRec;
  408.   TVTSHAPETypeRec = record
  409.      DescriptorCount          : TItemCount;
  410.      DescriptorArray          : PVtblShapeDescriptors
  411.   end;
  412.   PLABELTypeRec = ^TLABELTypeRec;
  413.   TLABELTypeRec = record
  414.      NearFar                  : TNearFar;
  415.   end;
  416.   PSETTypeRec = ^TSETTypeRec;
  417.   TSETTypeRec = record
  418.      ElemType                 : TTypeIndex;
  419.      NameIndex                : TNameIndex;
  420.      LowByte                  : DWORD;
  421.      Length                   : TItemCount;
  422.   end;
  423.   PSUBRANGETypeRec = ^TSUBRANGETypeRec;
  424.   TSUBRANGETypeRec = record
  425.      BaseType                 : TTypeIndex;
  426.      NameIndex                : TNameIndex;
  427.      LoBound                  : DWORD;
  428.      HiBound                  : DWORD;
  429.      Size                     : TByteCount;
  430.   end;     
  431.   PPARRAYTypeRec = ^TPARRAYTypeRec;
  432.   TPARRAYTypeRec = record
  433.      ElementType              : TTypeIndex;
  434.      IndexType                : TTypeIndex;
  435.      NameIndex                : TNameIndex;
  436.      Size                     : TByteCount;
  437.      Elements                 : TItemCount;
  438.   end;
  439.   PPSTRINGTypeRec = ^TPSTRINGTypeRec;
  440.   TPSTRINGTypeRec = record
  441.      ElemType                 : TTypeIndex;
  442.      IndexType                : TTypeIndex;
  443.      NameIndex                : TNameIndex;
  444.   end;
  445.   PCLOSURETypeRec = ^TCLOSURETypeRec;
  446.   TCLOSURETypeRec = record
  447.      ReturnType               : TTypeIndex;
  448.      CallingConvention        : TCallingConvention;
  449.      ArgCount                 : TItemCount;
  450.      ArgList                  : TTypeIndex;
  451.   end;
  452.   PPROPERTYTypeRec = ^TPROPERTYTypeRec;
  453.   TPROPERTYTypeRec = record
  454.      TypeIndex                : TTypeIndex;
  455.      Flags                    : TPropertyFlags;
  456.      ArrayIndex               : TTypeIndex;
  457.      PropIndex                : TPropertyIndex;
  458.      ReadSlot                 : TPropertySlot;
  459.      WriteSlot                : TPropertySlot;
  460.   end;
  461.   PLSTRINGTypeRec = ^TLSTRINGTypeRec;
  462.   TLSTRINGTypeRec = record
  463.      NameIndex                : TNameIndex;
  464.   end;
  465.   PVARIANTTypeRec = ^TVARIANTTypeRec;
  466.   TVARIANTTypeRec = record
  467.      NameIndex                : TNameIndex;
  468.   end;
  469.   PCLASSREFTypeRec = ^TCLASSREFTypeRec;
  470.   TCLASSREFTypeRec = record
  471.      RefType                  : TTypeIndex;
  472.      VtShape                  : TTypeIndex;
  473.   end;
  474.   PWSTRINGTypeRec = ^TWSTRINGTypeRec;
  475.   TWSTRINGTypeRec = record
  476.      NameIndex                : TNameIndex;
  477.   end;
  478.   PARGLISTTypeRec = ^TARGLISTTypeRec;
  479.   TARGLISTTypeRec = record
  480.      TypeCount                : TItemCount;
  481.      TypeArray                : PTypeIndices
  482.   end;
  483.   PDERIVEDTypeRec = ^TDERIVEDTypeRec;
  484.   TDERIVEDTypeRec = record
  485.      TypeCount                : TItemCount;
  486.      DerivedTypes             : PTypeIndices
  487.   end;
  488.   PBITFIELDTypeRec = ^TBITFIELDTypeRec;
  489.   TBITFIELDTypeRec = record
  490.      Length                   : TBitCount;
  491.      Position                 : TBitPosition;
  492.      TypeIndex                : TTypeIndex;
  493.   end;
  494.   PMETHODLISTTypeRec = ^TMETHODLISTTypeRec;
  495.   TMETHODLISTTypeRec = record
  496.      MethodCount              : TItemCount;
  497.      TypeArray                : PTypeIndices;
  498.      AttribArray              : PClassMemberAttribs;
  499.      BrowserArray             : PFileOffsets;
  500.      VtabOffArray             : PVtabOffsets
  501.   end;
  502.   PBCLASSTypeRec = ^TBCLASSTypeRec;
  503.   TBCLASSTypeRec = record
  504.      BaseType                 : TTypeIndex;
  505.      Attrib                   : TClassMemberAttrib;
  506.      Offset                   : TVtabOffset;
  507.   end;
  508.   PVBCLASSTypeRec = ^TVBCLASSTypeRec;
  509.   TVBCLASSTypeRec = record
  510.      vbType                   : TTypeIndex;
  511.      vbpType                  : TTypeIndex;
  512.      Attrib                   : TClassMemberAttrib;
  513.      VbpOffset                : TVtabOffset;
  514.      Offset                   : TVtabOffset;
  515.   end;
  516.   PIVBCLASSTypeRec = ^TIVBCLASSTypeRec;
  517.   TIVBCLASSTypeRec = record
  518.      vbType                   : TTypeIndex;
  519.      vbpType                  : TTypeIndex;
  520.      Attrib                   : TClassMemberAttrib;
  521.      VbpOffset                : TVtabOffset;
  522.      Offset                   : TVtabOffset;
  523.   end;
  524.   PENUMERATETypeRec = ^TENUMERATETypeRec;
  525.   TENUMERATETypeRec = record
  526.      Attrib                   : DWORD;
  527.      NameIndex                : TNameIndex;
  528.      BrowserOffset            : TFileOffset;
  529.      Value                    : DWORD;
  530.   end;
  531.   PFRIENDFCNTypeRec = ^TFRIENDFCNTypeRec;
  532.   TFRIENDFCNTypeRec = record
  533.      TypeIndex                : TTypeIndex;
  534.      NameIndex                : TNameIndex;
  535.   end;
  536.   PINDEXTypeRec = ^TINDEXTypeRec;
  537.   TINDEXTypeRec = record
  538.      TypeIndex                : TTypeIndex;
  539.   end;
  540.   PMEMBERTypeRec = ^TMEMBERTypeRec;
  541.   TMEMBERTypeRec = record
  542.      TypeIndex                : TTypeIndex;
  543.      Attrib                   : TClassMemberAttrib;
  544.      NameIndex                : TNameIndex;
  545.      Offset                   : TInstanceOffset;
  546.      BrowserOffset            : TFileOffset;
  547.   end;
  548.   PSTMEMBERTypeRec = ^TSTMEMBERTypeRec;
  549.   TSTMEMBERTypeRec = record
  550.      TypeIndex                : TTypeIndex;
  551.      Attrib                   : TClassMemberAttrib;
  552.      NameIndex                : TNameIndex;
  553.      BrowserOffset            : TFileOffset;
  554.   end;
  555.   PMETHODTypeRec = ^TMETHODTypeRec;
  556.   TMETHODTypeRec = record
  557.      OverloadedCount          : TItemCount;
  558.      MethodList               : TTypeIndex;
  559.      NameIndex                : TNameIndex;
  560.   end;
  561.   PNESTTYPETypeRec = ^TNESTTYPETypeRec;
  562.   TNESTTYPETypeRec = record
  563.      TypeIndex                : TTypeIndex;
  564.      NameIndex                : TNameIndex;
  565.      BrowserOffset            : TFileOffset;
  566.   end;
  567.   PVFUNCTABTypeRec = ^TVFUNCTABTypeRec;
  568.   TVFUNCTABTypeRec = record
  569.      TypeIndex                : TTypeIndex;
  570.      Offset                   : TVtabOffset;
  571.   end;
  572.   PFRIENDCLSTypeRec = ^TFRIENDCLSTypeRec;
  573.   TFRIENDCLSTypeRec = record
  574.      TypeIndex : TTypeIndex;
  575.   end;
  576.   PCHARTypeRec = ^TCHARTypeRec;
  577.   TCHARTypeRec = record
  578.      Value : Char;
  579.   end;
  580.   PSHORTTypeRec = ^TSHORTTypeRec;
  581.   TSHORTTypeRec = record
  582.      Value : SmallInt;
  583.   end;
  584.   PUSHORTTypeRec = ^TUSHORTTypeRec;
  585.   TUSHORTTypeRec = record
  586.      Value : DWORD;
  587.   end;
  588.   PLONGTypeRec = ^TLONGTypeRec;
  589.   TLONGTypeRec = record
  590.      Value : LongInt;
  591.   end;
  592.   PULONGTypeRec = ^TULONGTypeRec;
  593.   TULONGTypeRec = record
  594.      Value : DWORD;
  595.   end;
  596.   PREAL32TypeRec = ^TREAL32TypeRec;
  597.   TREAL32TypeRec = record
  598.      Value : Single;
  599.   end;
  600.   PREAL64TypeRec = ^TREAL64TypeRec;
  601.   TREAL64TypeRec = record
  602.      Value : Double;
  603.   end;
  604.   PREAL80TypeRec = ^TREAL80TypeRec;
  605.   TREAL80TypeRec = record
  606.      Value : Extended;
  607.   end;
  608.   PQUADWORDTypeRec = ^TQUADWORDTypeRec;
  609.   TQUADWORDTypeRec = record
  610.      Value : QUADWORD;
  611.   end;
  612.   PUQUADWORDTypeRec = ^TUQUADWORDTypeRec;
  613.   TUQUADWORDTypeRec = record
  614.      Value : UQUADWORD;
  615.   end;
  616.   PREAL48TypeRec = ^TREAL48TypeRec;
  617.   TREAL48TypeRec = record
  618.      Value : TREAL48;
  619.   end;
  620.  
  621.   PTypeInfoRec = ^TTypeInfoRec;
  622.   TTypeInfoRec = record
  623.     BDType : TBorDebugType;
  624.     case TTypeKind of
  625.       0                       : (TypePtr        : Pointer);
  626.       BORDEBUG_LF_MODIFIER    : (MODIFIERType   : PMODIFIERTypeRec);
  627.       BORDEBUG_LF_POINTER     : (POINTERType    : PPOINTERTypeRec);
  628.       BORDEBUG_LF_ARRAY       : (ARRAYType      : PARRAYTypeRec);
  629.       BORDEBUG_LF_STRUCT,
  630.       BORDEBUG_LF_CLASS       : (CLASSType      : PCLASSTypeRec);
  631.       BORDEBUG_LF_UNION       : (UNIONType      : PUNIONTypeRec);
  632.       BORDEBUG_LF_ENUM        : (ENUMType       : PENUMTypeRec);
  633.       BORDEBUG_LF_PROCEDURE   : (PROCEDUREType  : PPROCEDURETypeRec);
  634.       BORDEBUG_LF_MFUNCTION   : (MFUNCTIONType  : PMFUNCTIONTypeRec);
  635.       BORDEBUG_LF_VTSHAPE     : (VTSHAPEType    : PVTSHAPETypeRec);
  636.       BORDEBUG_LF_LABEL       : (LABELType      : PLABELTypeRec);
  637.       BORDEBUG_LF_SET         : (SETType        : PSETTypeRec);
  638.       BORDEBUG_LF_SUBRANGE    : (SUBRANGEType   : PSUBRANGETypeRec);
  639.       BORDEBUG_LF_PARRAY      : (PARRAYType     : PPARRAYTypeRec);
  640.       BORDEBUG_LF_PSTRING     : (PSTRINGType    : PPSTRINGTypeRec);
  641.       BORDEBUG_LF_CLOSURE     : (CLOSUREType    : PCLOSURETypeRec);
  642.       BORDEBUG_LF_PROPERTY    : (PROPERTYType   : PPROPERTYTypeRec);
  643.       BORDEBUG_LF_LSTRING     : (LSTRINGType    : PLSTRINGTypeRec);
  644.       BORDEBUG_LF_VARIANT     : (VARIANTType    : PVARIANTTypeRec);
  645.       BORDEBUG_LF_CLASSREF    : (CLASSREFType   : PCLASSREFTypeRec);
  646.       BORDEBUG_LF_WSTRING     : (WSTRINGType    : PWSTRINGTypeRec);
  647.       BORDEBUG_LF_ARGLIST     : (ARGLISTType    : PARGLISTTypeRec);
  648.       BORDEBUG_LF_DERIVED     : (DERIVEDType    : PDERIVEDTypeRec);
  649.       BORDEBUG_LF_BITFIELD    : (BITFIELDType   : PBITFIELDTypeRec);
  650.       BORDEBUG_LF_METHODLIST  : (METHODLISTType : PMETHODLISTTypeRec);
  651.       BORDEBUG_LF_BCLASS      : (BCLASSType     : PBCLASSTypeRec);
  652.       BORDEBUG_LF_VBCLASS     : (VBCLASSType    : PVBCLASSTypeRec);
  653.       BORDEBUG_LF_IVBCLASS    : (IVBCLASSType   : PIVBCLASSTypeRec);
  654.       BORDEBUG_LF_ENUMERATE   : (ENUMERATEType  : PENUMERATETypeRec);
  655.       BORDEBUG_LF_FRIENDFCN   : (FRIENDFCNType  : PFRIENDFCNTypeRec);
  656.       BORDEBUG_LF_INDEX       : (INDEXTypeR     : PINDEXTypeRec);
  657.       BORDEBUG_LF_MEMBER      : (MEMBERType     : PMEMBERTypeRec);
  658.       BORDEBUG_LF_STMEMBER    : (STMEMBERType   : PSTMEMBERTypeRec);
  659.       BORDEBUG_LF_METHOD      : (METHODType     : PMETHODTypeRec);
  660.       BORDEBUG_LF_NESTTYPE    : (NESTTYPEType   : PNESTTYPETypeRec);
  661.       BORDEBUG_LF_VFUNCTAB    : (VFUNCTABType   : PVFUNCTABTypeRec);
  662.       BORDEBUG_LF_FRIENDCLS   : (FRIENDCLSType  : PFRIENDCLSTypeRec);
  663.       BORDEBUG_LF_CHAR        : (CHARType       : PCHARTypeRec);
  664.       BORDEBUG_LF_SHORT       : (SHORTType      : PSHORTTypeRec);
  665.       BORDEBUG_LF_USHORT      : (USHORTType     : PUSHORTTypeRec);
  666.       BORDEBUG_LF_LONG        : (LONGType       : PLONGTypeRec);
  667.       BORDEBUG_LF_ULONG       : (ULONGType      : PULONGTypeRec);
  668.       BORDEBUG_LF_REAL32      : (REAL32Type     : PREAL32TypeRec);
  669.       BORDEBUG_LF_REAL64      : (REAL64Type     : PREAL64TypeRec);
  670.       BORDEBUG_LF_REAL80      : (REAL80Type     : PREAL80TypeRec);
  671.       BORDEBUG_LF_QUADWORD    : (QUADWORDType   : PQUADWORDTypeRec);
  672.       BORDEBUG_LF_UQUADWORD   : (UQUADWORDType  : PUQUADWORDTypeRec);
  673.       BORDEBUG_LF_REAL48      : (REAL48Type     : PREAL48TypeRec);
  674.   end;
  675.  
  676.   // Forward class declarations:
  677.   TModuleSegment     = class;
  678.   TSourceFileEntry   = class;
  679.   TLineNumberOffsets = class;
  680.   TBorDebugModule    = class;
  681.   TBorDebugSrcModule = class;
  682.   TSymbolInfo        = class;
  683.   TTypeInfo          = class;
  684.  
  685.   // TBorDebug: This is the main root class responsible for opening the EXE
  686.   // file and giving a simplified interface to the debug information provided
  687.   // by the BorDebug API
  688.  
  689.   TBorDebug = class(TObject)
  690.   private
  691.     // Surfaced through properties:
  692.     FHandle: TBorDebHandle;
  693.     FFileName: string;
  694.     FSkipNames: boolean;
  695.     FCacheNames: boolean;
  696.     FSubSectionCount: TItemCount;
  697.     FNameCount: TItemCount;
  698.     FTypeCount: TItemCount;
  699.     FTypesSignature: TSignature;
  700.     FSubSectionDirectoryOffset: TFileOffset;
  701.  
  702.     function GetHandle: TBorDebHandle;
  703.     procedure SetFileName(const Value: string);
  704.     function GetActive: boolean;
  705.     procedure SetActive(Value: boolean);
  706.  
  707.     function GetNames(Index: TNameIndex): string;
  708.     function GetUnmangledNames(Index: TNameIndex): string;
  709.     function GetRegisterName(RegIndex: TRegNameIndex): string;
  710.  
  711.     function GetSubSections(Index: TSubSectionIndex): TBorDebugSubSection;
  712.     function GetTypeFromIndex(TypeIndex: TTypeIndex): TBorDebugType;
  713.     function GetTypeFromOffset(Offset: TFileOffset): TBorDebugType;
  714.     function GetTypeName(TypeIndex: TTypeIndex): string;
  715.     function GetGlobalSymbols(const SubSection: TBorDebugSubSection): TBorDebugGlobalSymbol;
  716.   protected
  717.     // Possible add default loop here with overrideable/events for reporting...?
  718.   public
  719.     constructor Create(const aFilename: string = '');
  720.     destructor Destroy; override;
  721.     procedure Open;
  722.     procedure Close;
  723.     property Handle: TBorDebHandle read GetHandle;
  724.  
  725.     // FileName must be set to the EXE/DLL/DPL/BPL/OCX... file
  726.     property FileName: string read FFileName write SetFileName;
  727.     property SkipNames: boolean read FSkipNames write FSkipNames default False;
  728.     property CacheNames: boolean read FCacheNames write FCacheNames default True;
  729.  
  730.     // Active := True/False is the same as Open/Close
  731.     property Active: boolean read GetActive write SetActive;
  732.  
  733.     // Use 1..NameCount as index. NOTE: 1-based!
  734.     property NameCount: TItemCount read FNameCount;
  735.     property Names[Index: TNameIndex]: string read GetNames;
  736.     property UnmangledNames[Index: TNameIndex]: string read GetUnmangledNames;
  737.  
  738.     // The RegIndex comes from BorDebugSymbolOPTVAR32
  739.     property RegisterName[RegIndex: TRegNameIndex]: string read GetRegisterName;
  740.  
  741.     // Use 0..SubSectionCount-1 as index
  742.     property SubSectionCount: TItemCount read FSubSectionCount;
  743.     property SubSections[Index: TSubSectionIndex]: TBorDebugSubSection read GetSubSections;
  744.  
  745.     // Use SubSections[X] as index when SubSections[X].SubsectionType = BORDEBUG_SSTMODULE
  746.     function CreateModule(const SubSection: TBorDebugSubSection): TBorDebugModule;
  747.  
  748.     // Use SubSections[X] as index when SubSections[X].SubsectionType = BORDEBUG_SSTSRCMODULE
  749.     function CreateSrcModule(const SubSection: TBorDebugSubSection ): TBorDebugSrcModule;
  750.  
  751.     // Call this pair when SubSections[X].SubsectionType =
  752.     //    BORDEBUG_SSTALIGNSYM, BORDEBUG_SSTGLOBALSYM or BORDEBUG_SSTGLOBALPUB
  753.     procedure StartSymbols(const SubSection: TBorDebugSubSection);
  754.     function GetNextSymbol(var Symbol: TBorDebugSymbol): boolean;
  755.     function CreateSymbolInfo(const Symbol: TBorDebugSymbol): TSymbolInfo;
  756.  
  757.     function CreateTypeInfo(const aType: TBorDebugType): TTypeInfo;
  758.  
  759.     property TypeFromIndex[TypeIndex: TTypeIndex]: TBorDebugType read GetTypeFromIndex;
  760.     property TypeFromOffset[Offset: TFileOffset]: TBorDebugType read GetTypeFromOffset;
  761.     property TypeName[TypeIndex: TTypeIndex]: string read GetTypeName;
  762.  
  763.     // Use SubSections[X] as index when SubSections[X].SubsectionType =
  764.     //    BORDEBUG_SSTGLOBALSYM or BORDEBUG_SSTGLOBALPUB
  765.     property GlobalSymbols[const SubSection: TBorDebugSubSection]: TBorDebugGlobalSymbol read GetGlobalSymbols;
  766.     property TypeCount: TItemCount read FTypeCount;
  767.     property TypesSignature: TSignature read FTypesSignature;
  768.     property SubSectionDirectoryOffset: TFileOffset read FSubSectionDirectoryOffset;
  769.  
  770.   end;
  771.  
  772.   // TBorDebugObject contains the common properties of TBorDebugModule and
  773.   // TBorDebugSrcModule
  774.   TBorDebugObject = class(TObject)
  775.   private
  776.     FBorDebug           : TBorDebug;
  777.     FOffset             : TFileOffset;
  778.     function GetHandle: TBorDebHandle;
  779.   public
  780.     constructor Create(BorDebug: TBorDebug; Offset: TFileOffset);
  781.     destructor Destroy; override;
  782.     property BorDebug           : TBorDebug       read FBorDebug;
  783.     property Handle             : TBorDebHandle   read GetHandle;
  784.     property Offset             : TFileOffset     read FOffset;
  785.   end;
  786.  
  787.   // TBorDebugModule represents a unit of code that has been linked
  788.   // into the executable. All units end up here even if it there
  789.   // is no source code (DCU only).
  790.   TBorDebugModule = class(TBorDebugObject)
  791.   private
  792.     FOverlay            : TOverlayIndex;
  793.     FLibIndex           : TLibraryIndex;
  794.     FStyle              : TDebuggingStyle;
  795.     FNameIndex          : TNameIndex;
  796.     FTimeStamp          : TBDTimeStamp;
  797.     FSegmentCount       : TItemCount;
  798.     FModuleSegmentList  : TList;  // of TModuleSegment
  799.     function GetName: string;
  800.     function GetSegments(Index: integer): TModuleSegment;
  801.   public
  802.     constructor Create(BorDebug: TBorDebug; Offset: TFileOffset);
  803.     destructor Destroy; override;
  804.  
  805.     property Overlay            : TOverlayIndex   read FOverlay;
  806.     property LibIndex           : TLibraryIndex   read FLibIndex;
  807.     property Style              : TDebuggingStyle read FStyle;
  808.     property TimeStamp          : TBDTimeStamp    read FTimeStamp;
  809.     property SegmentCount       : TItemCount      read FSegmentCount;
  810.     property NameIndex          : TNameIndex      read FNameIndex;
  811.     property Name               : string          read GetName;
  812.     // Index list with 0..SegmentCount-1
  813.     property ModuleSegmentList  : TList           read FModuleSegmentList;
  814.     property Segments[Index: integer]: TModuleSegment read GetSegments;
  815.   end;
  816.  
  817.   // SrcModule = Pascal Unit.
  818.   // Should we rename it TBorDebugSrcUnit or TBorDebugUnit??
  819.   TBorDebugSrcModule = class(TBorDebugObject)
  820.   private
  821.     FRangeCount         : TItemCount;
  822.     FRangeSegments      : PSegmentIndices;
  823.     FRangeSegmentStarts : PSegmentOffsets;
  824.     FRangeSegmentEnds   : PSegmentOffsets;
  825.  
  826.     FSourceCount        : TItemCount;
  827.     FSourceOffsets      : PFileOffsets;
  828.     FNameIndices        : PNameIndices;
  829.     FRangeCounts        : PItemCounts;
  830.  
  831.     FSourceFileList     : TList;  // of TSourceFileEntry
  832.     function GetSources(Index: integer): TSourceFileEntry;
  833.     function GetSourceNames(Index: integer): string;
  834.   public
  835.     constructor Create(BorDebug: TBorDebug; Offset: TFileOffset);
  836.     destructor Destroy; override;
  837.  
  838.     // Index arrays with 0..RangeCount-1
  839.     property RangeCount         : TItemCount      read FRangeCount;
  840.     property RangeSegments      : PSegmentIndices read FRangeSegments;
  841.     property RangeSegmentStarts : PSegmentOffsets read FRangeSegmentStarts;
  842.     property RangeSegmentEnds   : PSegmentOffsets read FRangeSegmentEnds;
  843.  
  844.     // Index arrays with 0..SourceCount-1
  845.     property SourceCount        : TItemCount      read FSourceCount;
  846.     property SourceOffsets      : PFileOffsets    read FSourceOffsets;
  847.     property NameIndices        : PNameIndices    read FNameIndices;
  848.     property RangeCounts        : PItemCounts     read FRangeCounts;
  849.  
  850.     // Index list with 0..SourceCount-1
  851.     property SourceFileList     : TList           read FSourceFileList;
  852.     property SourceFiles[Index: integer]: TSourceFileEntry read GetSources;
  853.     property SourceNames[Index: integer]: string read GetSourceNames;
  854.   end;
  855.  
  856.   TModuleSegment = class(TObject)
  857.   private
  858.     FLinkerSegment : TLinkerSegmentIndex;
  859.     FOffset        : TFileOffset;
  860.     FSize          : TByteCount;
  861.     FFlags         : TSegmentFlags;
  862.   public
  863.     constructor Create(Module       : TBorDebugModule;
  864.                        SegmentIndex : TSegmentIndex);
  865.     property LinkerSegment     : TLinkerSegmentIndex read FLinkerSegment;
  866.     property Offset            : TFileOffset         read FOffset;
  867.     property Size              : TByteCount          read FSize;
  868.     property Flags             : TSegmentFlags       read FFlags;
  869.   end;
  870.  
  871.   TSourceFileEntry = class(TObject)
  872.   private
  873.     FSrcModule                : TBorDebugSrcModule;
  874.     FSourceFileIndex          : TSourceFileIndex;
  875.     FRangeSegments            : PSegmentIndices;
  876.     FRangeSegmentStarts       : PSegmentOffsets;
  877.     FRangeSegmentEnds         : PSegmentOffsets;
  878.     FLineNumberCounts         : PItemCounts;
  879.     FLineNumerOffsetList      : TList; // of TLineNumberOffsets
  880.     function GetRangeLineNumbers(Index: integer): TLineNumberOffsets;
  881.     function GetName: string;
  882.     function GetBorDebug: TBorDebug;
  883.     function GetHandle: TBorDebHandle;
  884.     function GetNameIndex: TNameIndex;
  885.     function GetOffset: TFileOffset;
  886.     function GetRangeCount: TItemCount;
  887.   public
  888.     constructor Create(SrcModule       : TBorDebugSrcModule;
  889.                        SourceFileIndex : TSourceFileIndex);
  890.     destructor Destroy; override;
  891.     property BorDebug           : TBorDebug        read GetBorDebug;
  892.     property Handle             : TBorDebHandle    read GetHandle;
  893.     property Offset             : TFileOffset      read GetOffset;
  894.     property SrcModule          : TBorDebugSrcModule read FSrcModule;
  895.     property Name               : string           read GetName;
  896.     property NameIndex          : TNameIndex       read GetNameIndex;
  897.     property SourceFileIndex    : TSourceFileIndex read FSourceFileIndex;
  898.     property RangeSegments      : PSegmentIndices  read FRangeSegments;
  899.     property RangeSegmentStarts : PSegmentOffsets  read FRangeSegmentStarts;
  900.     property RangeSegmentEnds   : PSegmentOffsets  read FRangeSegmentEnds;
  901.     property LineNumberCounts   : PItemCounts      read FLineNumberCounts;
  902.     property LineNumerOffsetList: TList            read FLineNumerOffsetList;
  903.     property RangeCount         : TItemCount       read GetRangeCount;
  904.     property RangeLineNumbers[Index: integer]: TLineNumberOffsets read GetRangeLineNumbers;
  905.   end;
  906.  
  907.   TLineNumberOffsets = class(TObject)
  908.   private
  909.     FSourceFile  : TSourceFileEntry;
  910.     FLineNumbers : PLineNumbers;
  911.     FLineOffsets : PSegmentOffsets;
  912.     FRangeIndex  : TRangeIndex;
  913.     function GetLineCount: TItemCount;
  914.   public
  915.     constructor Create(SourceFile : TSourceFileEntry;
  916.                        RangeIndex : TRangeIndex);
  917.     destructor Destroy; override;
  918.     property SourceFile  : TSourceFileEntry read FSourceFile;
  919.     property LineNumbers : PLineNumbers     read FLineNumbers;
  920.     property LineOffsets : PSegmentOffsets  read FLineOffsets;
  921.     property LineCount   : TItemCount       read GetLineCount;
  922.     property RangeIndex  : TRangeIndex      read FRangeIndex;
  923.   end;
  924.  
  925.   TSymbolInfo = class(TObject)
  926.   private
  927.     FInfoRec: TSymbolInfoRec;
  928.     function GetKindAsString: string;
  929.   public
  930.     constructor Create(BorDebug: TBorDebug; Symbol: TBorDebugSymbol);
  931.     destructor Destroy; override;
  932.     function GetTypeIndex(var TypeIndex: TTypeIndex): boolean;
  933.     function GetNameIndex(var NameIndex: TNameIndex): boolean;
  934.     property Symbol        : TBorDebugSymbol read FInfoRec.Symbol;
  935.     property SymbolOffset  : TFileOffset     read FInfoRec.Symbol.Offset;
  936.     property Len           : TByteCount      read FInfoRec.Symbol.Len;
  937.     property Kind          : TSymbolKind     read FInfoRec.Symbol.Kind;
  938.     property Info          : TSymbolInfoRec  read FInfoRec;
  939.     property KindAsString  : string          read GetKindAsString;
  940.   end;
  941.  
  942.   TTypeInfo = class(TObject)
  943.   private
  944.     FInfoRec: TTypeInfoRec;
  945.     function GetNameIndex: TNameIndex;
  946.     function GetKindAsString: string;
  947.   public
  948.     constructor Create(BorDebug: TBorDebug; aType: TBorDebugType);
  949.     destructor Destroy; override;
  950.  
  951.     property BDType        : TBorDebugType   read FInfoRec.BDType;
  952.     property TypeIndex     : TTypeIndex      read FInfoRec.BDType.TypeIndex;
  953.     property TypeOffset    : TFileOffset     read FInfoRec.BDType.TypeOffset;
  954.     property Length        : TByteCount      read FInfoRec.BDType.Length;
  955.     property TypeKind      : TTypeKind       read FInfoRec.BDType.TypeKind;
  956.     property Info          : TTypeInfoRec    read FInfoRec;
  957.     property NameIndex     : TNameIndex      read GetNameIndex;
  958.     property KindAsString  : string          read GetKindAsString;
  959.   end;
  960.  
  961. { Utility routines }
  962. procedure FreeObject(var Instance);
  963. procedure FreePtr(var Ptr);
  964. procedure FreeTList(var List: TList);
  965. function SymbolKindToString(SymbolKind: TSymbolKind): string;
  966. function SaveRegsToString(SaveRegs: TSaveRegs): string;
  967. function TypeKindToString(TypeKind: TTypeKind): string;
  968. function SubsectionTypeToString(SubsectionType: TSubsectionType): string;
  969. function ClassFlagsToString(ClassFlags: TClassFlags): string;
  970. function CallingConventionToString(CallingConvention: TCallingConvention): string;
  971. function PropertyFlagsToString(PropertyFlags: TPropertyFlags): string;
  972. function ClassMemberAttribToString(ClassMemberAttrib: TClassMemberAttrib): string;
  973.  
  974. implementation
  975.  
  976. { Utility routines }
  977.  
  978. resourcestring
  979.   SIndexOutOfRange = 'Index %d out of valid range 0..%d';
  980.   SUnexpectedSection = 'Unexpected subsection type here: %s';
  981.  
  982. procedure CheckIndex(Index, Count: integer);
  983. begin
  984.   if (Index < 0) or (Index >= Count) then
  985.     raise HVBorDebugIndexError.CreateFmt(SIndexOutOfRange, [Index, Count-1]);
  986. end;
  987.  
  988. procedure CheckSection(SubsectionType: TSubsectionType; ValidSubSections: array of TSubsectionType);
  989. var
  990.   i : integer;
  991. begin
  992.   for i:= Low(ValidSubSections) to High(ValidSubSections) do
  993.     if SubsectionType = ValidSubSections[i] then
  994.       Exit;
  995.   raise HVBorDebugSectionError.CreateFmt(SUnexpectedSection,
  996.     [SubSectionTypeToString(SubsectionType)]);
  997. end;
  998.  
  999. procedure FreeObject(var Instance);
  1000. var
  1001.   Tmp: TObject;
  1002. begin
  1003.   Tmp := TObject(Instance);
  1004.   TObject(Instance) := nil;
  1005.   Tmp.Free;
  1006. end;
  1007.  
  1008. procedure FreePtr(var Ptr);
  1009. begin
  1010.   FreeMem(Pointer(Ptr));
  1011.   Pointer(Ptr) := nil;
  1012. end;
  1013.  
  1014. procedure FreeTList(var List: TList);
  1015. var
  1016.   i : integer;
  1017. begin
  1018.   for i := 0 to List.Count-1 do
  1019.     FreeObject(List.List^[i]);
  1020.   FreeObject(List);
  1021. end;
  1022.  
  1023. function SaveRegsToString(SaveRegs: TSaveRegs): string;
  1024. begin
  1025.   Result := '';
  1026.   if srEBX in SaveRegs then Result := Result + 'EBX, ';
  1027.   if srEDI in SaveRegs then Result := Result + 'EDI, ';
  1028.   if srESI in SaveRegs then Result := Result + 'ESI, ';
  1029.   if srEBP in SaveRegs then Result := Result + 'EBP, ';
  1030.   if Result <> '' then
  1031.   begin
  1032.     Delete(Result, Length(Result)-1, 2);
  1033.     Result := '[' + Result + ']';
  1034.   end;
  1035. end;
  1036.  
  1037. function SymbolKindToString(SymbolKind: TSymbolKind): string;
  1038. begin
  1039.   case SymbolKind of
  1040.     BORDEBUG_S_COMPILE      : Result := 'COMPILE';
  1041.     BORDEBUG_S_REGISTER     : Result := 'REGISTER';
  1042.     BORDEBUG_S_CONST        : Result := 'CONST';
  1043.     BORDEBUG_S_UDT          : Result := 'UDT';
  1044.     BORDEBUG_S_SSEARCH      : Result := 'SSEARCH';
  1045.     BORDEBUG_S_END          : Result := 'END';
  1046.     BORDEBUG_S_SKIP         : Result := 'SKIP';
  1047.     BORDEBUG_S_CVRESERVE    : Result := 'CVRESERVE' ;
  1048.     BORDEBUG_S_OBJNAME      : Result := 'OBJNAME';
  1049.     BORDEBUG_S_GPROCREF     : Result := 'GPROCREF';
  1050.     BORDEBUG_S_GDATAREF     : Result := 'GDATAREF';
  1051.     BORDEBUG_S_EDATA        : Result := 'EDATA';
  1052.     BORDEBUG_S_EPROC        : Result := 'EPROC';
  1053.     BORDEBUG_S_USES         : Result := 'USES';
  1054.     BORDEBUG_S_NAMESPACE    : Result := 'NAMESPACE' ;
  1055.     BORDEBUG_S_USING        : Result := 'USING';
  1056.     BORDEBUG_S_PCONSTANT    : Result := 'PCONSTANT' ;
  1057.     BORDEBUG_S_BPREL32      : Result := 'BPREL';
  1058.     BORDEBUG_S_LDATA32      : Result := 'LDATA';
  1059.     BORDEBUG_S_GDATA32      : Result := 'GDATA';
  1060.     BORDEBUG_S_PUB32        : Result := 'PUB';
  1061.     BORDEBUG_S_LPROC32      : Result := 'LPROC';
  1062.     BORDEBUG_S_GPROC32      : Result := 'GPROC';
  1063.     BORDEBUG_S_THUNK32      : Result := 'THUNK';
  1064.     BORDEBUG_S_BLOCK32      : Result := 'BLOCK';
  1065.     BORDEBUG_S_WITH32       : Result := 'WITH';
  1066.     BORDEBUG_S_LABEL32      : Result := 'LABEL';
  1067.     BORDEBUG_S_CEXMODEL32   : Result := 'CEXMODEL' ;
  1068.     BORDEBUG_S_VFTPATH32    : Result := 'VFTPATH' ;
  1069.     BORDEBUG_S_ENTRY32      : Result := 'ENTRY';
  1070.     BORDEBUG_S_OPTVAR32     : Result := 'OPTVAR';
  1071.     BORDEBUG_S_PROCRET32    : Result := 'PROCRET' ;
  1072.     BORDEBUG_S_SAVREGS32    : Result := 'SAVREGS' ;
  1073.     BORDEBUG_S_SLINK32      : Result := 'SLINK';
  1074.     BORDEBUG_S_INVALID      : Result := 'INVALID';
  1075.   else                        Result := Format('<Unknown SymbolKind = %.8x)', [Ord(SymbolKind)]);
  1076.   end;
  1077. end;
  1078.  
  1079. function TypeKindToString(TypeKind: TTypeKind): string;
  1080. begin
  1081.   case TypeKind of
  1082.     BORDEBUG_LF_STARTYP     : Result := 'STARTYP';
  1083.     BORDEBUG_LF_MODIFIER    : Result := 'MODIFIER';
  1084.     BORDEBUG_LF_POINTER     : Result := 'POINTER';
  1085.     BORDEBUG_LF_ARRAY       : Result := 'ARRAY';
  1086.     BORDEBUG_LF_CLASS       : Result := 'CLASS';
  1087.     BORDEBUG_LF_STRUCT      : Result := 'STRUCT';
  1088.     BORDEBUG_LF_UNION       : Result := 'UNION';
  1089.     BORDEBUG_LF_ENUM        : Result := 'ENUM';
  1090.     BORDEBUG_LF_PROCEDURE   : Result := 'PROCEDURE';
  1091.     BORDEBUG_LF_MFUNCTION   : Result := 'MFUNCTION';
  1092.     BORDEBUG_LF_VTSHAPE     : Result := 'VTSHAPE';
  1093.     BORDEBUG_LF_COBOL0      : Result := 'COBOL0';
  1094.     BORDEBUG_LF_COBOL1      : Result := 'COBOL1';
  1095.     BORDEBUG_LF_BARRAY      : Result := 'BARRAY';
  1096.     BORDEBUG_LF_LABEL       : Result := 'LABEL';
  1097.     BORDEBUG_LF_NULL        : Result := 'NULL';
  1098.     BORDEBUG_LF_NOTTRANS    : Result := 'NOTTRANS';
  1099.     BORDEBUG_LF_DIMARRAY    : Result := 'DIMARRAY';
  1100.     BORDEBUG_LF_VFTPATH     : Result := 'VFTPATH';
  1101.     BORDEBUG_LF_SET         : Result := 'SET';
  1102.     BORDEBUG_LF_SUBRANGE    : Result := 'SUBRANGE';
  1103.     BORDEBUG_LF_PARRAY      : Result := 'PARRAY';
  1104.     BORDEBUG_LF_PSTRING     : Result := 'PSTRING';
  1105.     BORDEBUG_LF_CLOSURE     : Result := 'CLOSURE';
  1106.     BORDEBUG_LF_PROPERTY    : Result := 'PROPERTY';
  1107.     BORDEBUG_LF_LSTRING     : Result := 'LSTRING';
  1108.     BORDEBUG_LF_VARIANT     : Result := 'VARIANT';
  1109.     BORDEBUG_LF_CLASSREF    : Result := 'CLASSREF';
  1110.     BORDEBUG_LF_WSTRING     : Result := 'WSTRING';
  1111.     BORDEBUG_LF_UNKNOWN     : Result := 'UNKNOWN';
  1112.     BORDEBUG_LF_INVALID_0   : Result := 'INVALID_0';
  1113.     BORDEBUG_LF_SKIP        : Result := 'SKIP';
  1114.     BORDEBUG_LF_ARGLIST     : Result := 'ARGLIST';
  1115.     BORDEBUG_LF_DEFARG      : Result := 'DEFARG';
  1116.     BORDEBUG_LF_LIST        : Result := 'LIST';
  1117.     BORDEBUG_LF_FIELDLIST   : Result := 'FIELDLIST';
  1118.     BORDEBUG_LF_DERIVED     : Result := 'DERIVED';
  1119.     BORDEBUG_LF_BITFIELD    : Result := 'BITFIELD';
  1120.     BORDEBUG_LF_METHODLIST  : Result := 'METHODLIST';
  1121.     BORDEBUG_LF_DIMCONU     : Result := 'DIMCONU';
  1122.     BORDEBUG_LF_DIMCONLU    : Result := 'DIMCONLU';
  1123.     BORDEBUG_LF_DIMVARU     : Result := 'DIMVARU';
  1124.     BORDEBUG_LF_DIMVARLU    : Result := 'DIMVARLU';
  1125.     BORDEBUG_LF_REFSYM      : Result := 'REFSYM';
  1126.     BORDEBUG_LF_INVALID_2   : Result := 'INVALID_2';
  1127.     BORDEBUG_LF_BCLASS      : Result := 'BCLASS';
  1128.     BORDEBUG_LF_VBCLASS     : Result := 'VBCLASS';
  1129.     BORDEBUG_LF_IVBCLASS    : Result := 'IVBCLASS';
  1130.     BORDEBUG_LF_ENUMERATE   : Result := 'ENUMERATE';
  1131.     BORDEBUG_LF_FRIENDFCN   : Result := 'FRIENDFCN';
  1132.     BORDEBUG_LF_INDEX       : Result := 'INDEX';
  1133.     BORDEBUG_LF_MEMBER      : Result := 'MEMBER';
  1134.     BORDEBUG_LF_STMEMBER    : Result := 'STMEMBER';
  1135.     BORDEBUG_LF_METHOD      : Result := 'METHOD';
  1136.     BORDEBUG_LF_NESTTYPE    : Result := 'NESTTYPE';
  1137.     BORDEBUG_LF_VFUNCTAB    : Result := 'VFUNCTAB';
  1138.     BORDEBUG_LF_FRIENDCLS   : Result := 'FRIENDCLS';
  1139.     BORDEBUG_LF_INVALID_4   : Result := 'INVALID_4';
  1140.     BORDEBUG_LF_CHAR        : Result := 'CHAR';
  1141.     BORDEBUG_LF_SHORT       : Result := 'SHORT';
  1142.     BORDEBUG_LF_USHORT      : Result := 'USHORT';
  1143.     BORDEBUG_LF_LONG        : Result := 'LONG';
  1144.     BORDEBUG_LF_ULONG       : Result := 'ULONG';
  1145.     BORDEBUG_LF_REAL32      : Result := 'REAL32';
  1146.     BORDEBUG_LF_REAL64      : Result := 'REAL64';
  1147.     BORDEBUG_LF_REAL80      : Result := 'REAL80';
  1148.     BORDEBUG_LF_REAL128     : Result := 'REAL128';
  1149.     BORDEBUG_LF_QUADWORD    : Result := 'QUADWORD';
  1150.     BORDEBUG_LF_UQUADWORD   : Result := 'UQUADWORD';
  1151.     BORDEBUG_LF_REAL48      : Result := 'REAL48';
  1152.     BORDEBUG_LF_INVALID_8   : Result := 'INVALID_8';
  1153.     BORDEBUG_LF_RAWBITS     : Result := 'RAWBITS';
  1154.     BORDEBUG_LF_INVALID_9   : Result := 'INVALID_9';
  1155.   else                        Result := Format('<Unknown TypeKind = %.8x)', [Ord(TypeKind)]);
  1156.   end;
  1157. end;
  1158.  
  1159. function SubsectionTypeToString(SubsectionType: TSubsectionType): string;
  1160. begin
  1161.    case SubsectionType of
  1162.     BORDEBUG_SSTMODULE      : Result := 'MODULE';
  1163.     BORDEBUG_SSTALIGNSYM    : Result := 'ALIGNSYM';
  1164.     BORDEBUG_SSTSRCMODULE   : Result := 'SRCMODULE';
  1165.     BORDEBUG_SSTGLOBALSYM   : Result := 'GLOBALSYM';
  1166.     BORDEBUG_SSTGLOBALPUB   : Result := 'GLOBALPUB';
  1167.     BORDEBUG_SSTGLOBALTYPES : Result := 'GLOBALTYPES';
  1168.     BORDEBUG_SSTNAMES       : Result := 'NAMES';
  1169.     BORDEBUG_SSTBROWSE      : Result := 'BROWSE';
  1170.     BORDEBUG_SSTINVALID     : Result := 'INVALID';
  1171.    else                       Result := Format('<Unknown SubSectionType = %.8x)', [Ord(SubSectionType)]);
  1172.    end;
  1173. end;
  1174.  
  1175. function ClassFlagsToString(ClassFlags: TClassFlags): string;
  1176. var
  1177.   ClassFlag: TClassFlag;
  1178. begin
  1179.   Result := '';
  1180.   for ClassFlag := Low(ClassFlag) to High(ClassFlag) do
  1181.     if ClassFlag in ClassFlags then
  1182.       Result := Result + TypInfo.GetEnumName(TypeInfo(TClassFlag), Ord(ClassFlag)) + ',';
  1183.   if Result <> '' then
  1184.     Delete(Result, Length(Result), 1);
  1185.   Result := '['+Result+']';
  1186. end;
  1187.  
  1188. function PropertyFlagsToString(PropertyFlags: TPropertyFlags): string;
  1189. var
  1190.   PropertyFlag: TPropertyFlag;
  1191. begin
  1192.   Result := '';
  1193.   for PropertyFlag := Low(PropertyFlag) to High(PropertyFlag) do
  1194.     if PropertyFlag in PropertyFlags then
  1195.       Result := Result + TypInfo.GetEnumName(TypeInfo(TPropertyFlag), Ord(PropertyFlag)) + ',';
  1196.   if Result <> '' then
  1197.     Delete(Result, Length(Result), 1);
  1198.   Result := '['+Result+']';
  1199. end;
  1200.  
  1201. function CallingConventionToString(CallingConvention: TCallingConvention): string;
  1202. var
  1203.   CC: TCallingConvention;
  1204. begin
  1205.   CC := CallingConvention and ccLowerMask;
  1206.   case CC of
  1207.     ccNearC          : Result :='NearC';
  1208.     ccFarC           : Result :='FarC';
  1209.     ccNearPascal     : Result :='NearPascal';
  1210.     ccFarPascal      : Result :='FarPascal';
  1211.     ccNearFastCall   : Result :='NearFastCall';
  1212.     ccFarFastCall    : Result :='FarFastCall';
  1213.     ccPCode          : Result :='PCode';
  1214.     ccNearStdCall    : Result :='NearStdCall';
  1215.     ccFarStdCall     : Result :='FarStdCall';
  1216.     ccNearSysCall    : Result :='NearSysCall';
  1217.     ccFarSysCall     : Result :='FarSysCall';
  1218.     ccThisCall       : Result :='ThisCall';
  1219.     ccNearFastCall2  : Result :='NearFastCall2';
  1220.     else               Result := '??';
  1221.   end;
  1222.   if (CallingConvention and ccFastThis) <> 0 then
  1223.     Result := Result + ', FastThis';
  1224.  
  1225.   if (CallingConvention and ccVarArgs) <> 0 then
  1226.     Result := Result + ', VarArgs';
  1227. end;
  1228.  
  1229. function ClassMemberAttribToString(ClassMemberAttrib: TClassMemberAttrib): string;
  1230. var
  1231.   CrackedClassMemberAttrib: TCrackedClassMemberAttrib;
  1232. begin
  1233.   CrackedClassMemberAttrib := CrackClassMemberAttrib(ClassMemberAttrib);
  1234.   Result :=  Format('%s, %s',
  1235.     [TypInfo.GetEnumName(TypeInfo(TClassMemberProtection), Ord(CrackedClassMemberAttrib.ClassMemberProtection)),
  1236.      TypInfo.GetEnumName(TypeInfo(TClassMemberProperty)  , Ord(CrackedClassMemberAttrib.ClassMemberProperty))]);
  1237. end;
  1238.  
  1239. { TBorDebug }
  1240.  
  1241. constructor TBorDebug.Create(const aFilename: string ='');
  1242. begin
  1243.   inherited Create;
  1244.   FSkipNames := False;
  1245.   FCacheNames := True;
  1246.   FFilename := aFilename;
  1247. end;
  1248.  
  1249. destructor TBorDebug.Destroy;
  1250. begin
  1251.   inherited Destroy;
  1252. end;
  1253.  
  1254. procedure TBorDebug.Open;
  1255. begin
  1256.   Close;
  1257.   FHandle := BorDebugRegisterFileEx(FileName, SkipNames, CacheNames, True);
  1258.   FSubSectionDirectoryOffset := BorDebugSubSectionDirOffset(FHandle);
  1259.   FSubSectionCount           := BorDebugSubSectionCount(FHandle);
  1260.   FNameCount                 := BorDebugNamesTotalNames(FHandle);
  1261.   BorDebugGlobalTypes(FHandle, FTypesSignature, FTypeCount);
  1262. end;
  1263.  
  1264. procedure TBorDebug.Close;
  1265. begin
  1266.   if Active then
  1267.   begin
  1268.     BorDebugUnregisterFile(FHandle);
  1269.     FHandle := InvalidBorDebHandle;
  1270.   end;
  1271. end;
  1272.  
  1273. function TBorDebug.GetHandle: TBorDebHandle;
  1274. begin
  1275.   if FHandle = InvalidBorDebHandle then
  1276.     Open;
  1277.   Result := FHandle;
  1278. end;
  1279.  
  1280. procedure TBorDebug.SetFileName(const Value: string);
  1281. begin
  1282.   if CompareText(Value, FileName) <> 0 then
  1283.   begin
  1284.     Close;
  1285.     FFileName := Value;
  1286.   end;
  1287. end;
  1288.  
  1289. function TBorDebug.GetActive: boolean;
  1290. begin
  1291.   Result := (FHandle <> InvalidBorDebHandle);
  1292. end;
  1293.  
  1294. procedure TBorDebug.SetActive(Value: boolean);
  1295. begin
  1296.   if Value <> Active then
  1297.   begin
  1298.     if Value then
  1299.       Open
  1300.     else
  1301.       Close;
  1302.   end;
  1303. end;
  1304.  
  1305. function TBorDebug.GetNames(Index: TNameIndex): string;
  1306. var
  1307.   Buffer: array[0..260] of char;
  1308. begin
  1309.   CheckIndex(Index, NameCount);
  1310.   BorDebugNameIndexToName(Handle, Index, @Buffer, SizeOf(Buffer));
  1311.   SetString(Result, Buffer, StrLen(Buffer));
  1312. end;
  1313.  
  1314. function TBorDebug.GetUnmangledNames(Index: TNameIndex): string;
  1315. var
  1316.   Buffer: array[0..1024] of char;
  1317. begin
  1318.   CheckIndex(Index, NameCount);
  1319.   BorDebugNameIndexToUnmangledName(Handle, Index, @Buffer, SizeOf(Buffer));
  1320.   SetString(Result, Buffer, StrLen(Buffer));
  1321. end;
  1322.  
  1323. function TBorDebug.GetRegisterName(RegIndex: TRegNameIndex): string;
  1324. var
  1325.   Buffer: array[0..10] of char;
  1326. begin
  1327.   BorDebugRegIndexToName(Handle, RegIndex, @Buffer, SizeOf(Buffer));
  1328.   SetString(Result, Buffer, StrLen(Buffer));
  1329. end;
  1330.  
  1331. function TBorDebug.GetSubSections(Index: TSubSectionIndex): TBorDebugSubSection;
  1332. begin
  1333.   CheckIndex(Index, SubSectionCount);
  1334.   with Result do
  1335.     BorDebugSubSection(Handle, Index, SubsectionType, Module, Offset, Size);
  1336. end;
  1337.  
  1338. procedure TBorDebug.StartSymbols(const SubSection: TBorDebugSubSection);
  1339. begin
  1340.   CheckSection(SubSection.SubsectionType,
  1341.     [BORDEBUG_SSTALIGNSYM, BORDEBUG_SSTGLOBALSYM, BORDEBUG_SSTGLOBALPUB]);
  1342.   with SubSection do
  1343.     BorDebugStartSymbols(Handle, SubSectionType, Offset, Size);
  1344. end;
  1345.  
  1346. function TBorDebug.GetNextSymbol(var Symbol: TBorDebugSymbol): boolean;
  1347. begin
  1348.   with Symbol do
  1349.   begin
  1350.     BorDebugNextSymbol(Handle, Kind, Offset, Len);
  1351.     Result := not ((Kind = 0) and (Offset = 0) and (Len = 0))
  1352.   end;
  1353. end;
  1354.  
  1355. function TBorDebug.CreateSymbolInfo(const Symbol: TBorDebugSymbol): TSymbolInfo;
  1356. begin
  1357.   Result := TSymbolInfo.Create(Self, Symbol);
  1358. end;
  1359.  
  1360. function TBorDebug.CreateTypeInfo(const aType: TBorDebugType): TTypeInfo;
  1361. begin
  1362.   Result := TTypeInfo.Create(Self, aType);
  1363. end;
  1364.  
  1365. function TBorDebug.GetTypeFromIndex(TypeIndex: TTypeIndex): TBorDebugType;
  1366. begin
  1367.   Result.TypeIndex := TypeIndex;
  1368.   with Result do
  1369.     BorDebugTypeFromIndex(Handle, TypeIndex, TypeOffset, Length, TypeKind);
  1370. end;
  1371.  
  1372. function TBorDebug.GetTypeFromOffset(Offset: TFileOffset): TBorDebugType;
  1373. begin
  1374.   Result.TypeIndex := TTypeIndex(BORDEBUG_LF_INVALID_0);
  1375.   Result.TypeOffset:= Offset;
  1376.   with Result do
  1377.     BorDebugTypeFromOffset(Handle, TypeOffset, Length, TypeKind);
  1378. end;
  1379.  
  1380. function TBorDebug.GetTypeName(TypeIndex: TTypeIndex): string;
  1381. var
  1382.   Buffer: array[0..260] of char;
  1383. begin
  1384.   BorDebugTypeIndexToString(Handle, TypeIndex, @Buffer, SizeOf(Buffer));
  1385.   SetString(Result, Buffer, StrLen(Buffer));
  1386. end;
  1387.  
  1388. function TBorDebug.GetGlobalSymbols(const SubSection: TBorDebugSubSection): TBorDebugGlobalSymbol;
  1389. begin
  1390.   CheckSection(SubSection.SubsectionType,
  1391.     [BORDEBUG_SSTGLOBALSYM, BORDEBUG_SSTGLOBALPUB]);
  1392.   with Result do
  1393.     BorDebugGlobalSym(Handle, SubSection.Offset,
  1394.       SymHashFunction, AddrHashFunction,
  1395.       SymTableBytes, SymHashTableBytes, AddrHashTableBytes,
  1396.       TotalUDTs, TotalOtherSyms, TotalSymbols, TotalNameSpaces);
  1397. end;
  1398.  
  1399. function TBorDebug.CreateModule(const SubSection: TBorDebugSubSection ): TBorDebugModule;
  1400. begin
  1401.   CheckSection(SubSection.SubsectionType, [BORDEBUG_SSTMODULE]);
  1402.   Result := TBorDebugModule.Create(Self, SubSection.Offset);
  1403. end;
  1404.  
  1405. function TBorDebug.CreateSrcModule(const SubSection: TBorDebugSubSection ): TBorDebugSrcModule;
  1406. begin
  1407.   CheckSection(SubSection.SubsectionType, [BORDEBUG_SSTSRCMODULE]);
  1408.   Result := TBorDebugSrcModule.Create(Self, SubSection.Offset);
  1409. end;
  1410.  
  1411. { TBorDebugObject }
  1412.  
  1413. constructor TBorDebugObject.Create(BorDebug: TBorDebug; Offset: TFileOffset);
  1414. begin
  1415.   inherited Create;
  1416.   FBorDebug := BorDebug;
  1417.   FOffset := Offset;
  1418. end;
  1419.  
  1420. destructor TBorDebugObject.Destroy;
  1421. begin
  1422.   inherited Destroy;
  1423. end;
  1424.  
  1425. function TBorDebugObject.GetHandle: TBorDebHandle;
  1426. begin
  1427.   Result := BorDebug.Handle;
  1428. end;
  1429.  
  1430. { TBorDebugModule }
  1431.  
  1432. constructor TBorDebugModule.Create(BorDebug: TBorDebug; Offset: TFileOffset);
  1433. var
  1434.   SegmentIndex: integer;
  1435. begin
  1436.   inherited Create(BorDebug, Offset);
  1437.   // Get the static information about the Module and number of segments
  1438.   BorDebugModule(Handle, Offset,
  1439.     FOverlay, FLibIndex, FStyle, FNameIndex, FTimeStamp, FSegmentCount);
  1440.  
  1441.   // For each segment in for this source module, get details about the segment
  1442.   FModuleSegmentList := TList.Create;
  1443.   FModuleSegmentList.Capacity := SegmentCount;
  1444.   for SegmentIndex := 0 to SegmentCount-1 do
  1445.     FModuleSegmentList.Add(TModuleSegment.Create(Self, SegmentIndex));
  1446. end;
  1447.  
  1448. destructor TBorDebugModule.Destroy;
  1449. begin
  1450.   FreeTList(FModuleSegmentList);
  1451.   inherited Destroy;
  1452. end;
  1453.  
  1454. function TBorDebugModule.GetName: string;
  1455. begin
  1456.   Result := BorDebug.Names[NameIndex];
  1457. end;
  1458.  
  1459. function TBorDebugModule.GetSegments(Index: integer): TModuleSegment;
  1460. begin
  1461.   Result := TModuleSegment(FModuleSegmentList[Index]);
  1462. end;
  1463.  
  1464. { TBorDebugSrcModule }
  1465.  
  1466. constructor TBorDebugSrcModule.Create(BorDebug: TBorDebug; Offset: TFileOffset);
  1467. var
  1468.   SourceFileIndex: TSourceFileIndex;
  1469. begin
  1470.   inherited Create(BorDebug, Offset);
  1471.  
  1472.   // Get the number of ranges
  1473.   BorDebugSrcModule(BorDebug.Handle, Offset, FRangeCount, FSourceCount);
  1474.  
  1475.   // Allocate enough memory for each module range array
  1476.   GetMem(FRangeSegments     , RangeCount * SizeOf(FRangeSegments     ^[0]));
  1477.   GetMem(FRangeSegmentStarts, RangeCount * SizeOf(FRangeSegmentStarts^[0]));
  1478.   GetMem(FRangeSegmentEnds  , RangeCount * SizeOf(FRangeSegmentEnds  ^[0]));
  1479.  
  1480.   // Now get the segment index, start and end offsets for each range
  1481.   BorDebugSrcModuleRanges(BorDebug.Handle, Offset, FRangeSegments, FRangeSegmentStarts, FRangeSegmentEnds);
  1482.  
  1483.   // Allocate enough memory for each source file array
  1484.   GetMem(FSourceOffsets     , SourceCount * SizeOf(FSourceOffsets    ^[0]));
  1485.   GetMem(FNameIndices       , SourceCount * SizeOf(FNameIndices      ^[0]));
  1486.   GetMem(FRangeCounts       , SourceCount * SizeOf(FRangeCounts      ^[0]));
  1487.  
  1488.   // Now get the source segment offsets, name indecies and range counts
  1489.   BorDebugSrcModuleSources(BorDebug.Handle, Offset, FSourceOffsets, FNameIndices, FRangeCounts);
  1490.  
  1491.   // For each source file, get the range and line number details
  1492.   FSourceFileList := TList.Create;
  1493.   FSourceFileList.Capacity := SourceCount;
  1494.   for SourceFileIndex := 0 to SourceCount-1 do
  1495.     FSourceFileList.Add(TSourceFileEntry.Create(Self, SourceFileIndex));
  1496. end;
  1497.  
  1498. destructor TBorDebugSrcModule.Destroy;
  1499. begin
  1500.   FreeTList(FSourceFileList);
  1501.   FreePtr(FRangeCounts       );
  1502.   FreePtr(FNameIndices       );
  1503.   FreePtr(FSourceOffsets     );
  1504.   FreePtr(FRangeSegmentEnds  );
  1505.   FreePtr(FRangeSegmentStarts);
  1506.   FreePtr(FRangeSegments     );
  1507.   inherited Destroy;
  1508. end;
  1509.  
  1510. function TBorDebugSrcModule.GetSources(Index: integer): TSourceFileEntry;
  1511. begin
  1512.   Result := TSourceFileEntry(FSourceFileList[Index]);
  1513. end;
  1514.  
  1515. function TBorDebugSrcModule.GetSourceNames(Index: integer): string;
  1516. begin
  1517.   CheckIndex(Index, SourceCount);
  1518.   Result := BorDebug.Names[NameIndices^[Index]];
  1519. end;
  1520.  
  1521. { TModuleSegment }
  1522.  
  1523. constructor TModuleSegment.Create(Module       : TBorDebugModule;
  1524.                                   SegmentIndex : TSegmentIndex);
  1525. begin
  1526.   inherited Create;
  1527.   BorDebugModuleSegment(Module.Handle, Module.Offset, SegmentIndex,
  1528.     FLinkerSegment, FOffset, FSize, FFlags);
  1529. end;
  1530.  
  1531. { TSourceFileEntry }
  1532.  
  1533. constructor TSourceFileEntry.Create(SrcModule       : TBorDebugSrcModule;
  1534.                                     SourceFileIndex : TSourceFileIndex);
  1535. var
  1536.   RangeIndex : TRangeIndex;
  1537.   RangeCount : TItemCount;
  1538. begin
  1539.   inherited Create;
  1540.   FSrcModule       := SrcModule;
  1541.   FSourceFileIndex := SourceFileIndex;
  1542.  
  1543.   RangeCount := Self.RangeCount;
  1544.   // Allocate enough memory for the ranges in this source file
  1545.   GetMem(FRangeSegments     , RangeCount * SizeOf(FRangeSegments     ^[0]));
  1546.   GetMem(FRangeSegmentStarts, RangeCount * SizeOf(FRangeSegmentStarts^[0]));
  1547.   GetMem(FRangeSegmentEnds  , RangeCount * SizeOf(FRangeSegmentEnds  ^[0]));
  1548.   GetMem(FLineNumberCounts  , RangeCount * SizeOf(FLineNumberCounts  ^[0]));
  1549.  
  1550.   // Now get the information for each range       //TODO: Should be own offset!?
  1551.   BorDebugSrcModuleSourceRanges(Handle, Offset, SourceFileIndex,
  1552.     FRangeSegments, FRangeSegmentStarts, FRangeSegmentEnds, FLineNumberCounts);
  1553.  
  1554.   // For each range, get the line number details
  1555.   FLineNumerOffsetList := TList.Create;
  1556.   FLineNumerOffsetList.Capacity := RangeCount;
  1557.   for RangeIndex := 0 to RangeCount-1 do
  1558.     FLineNumerOffsetList.Add(TLineNumberOffsets.Create(Self, RangeIndex));
  1559. end;
  1560.  
  1561. destructor TSourceFileEntry.Destroy;
  1562. begin
  1563.   FreeTList(FLineNumerOffsetList);
  1564.   FreePtr(FLineNumberCounts  );
  1565.   FreePtr(FRangeSegmentEnds  );
  1566.   FreePtr(FRangeSegmentStarts);
  1567.   FreePtr(FRangeSegments     );
  1568.   inherited Destroy;
  1569. end;
  1570.  
  1571. function TSourceFileEntry.GetBorDebug: TBorDebug;
  1572. begin
  1573.   Result := SrcModule.BorDebug;
  1574. end;
  1575.  
  1576. function TSourceFileEntry.GetHandle: TBorDebHandle;
  1577. begin
  1578.   Result := SrcModule.Handle;
  1579. end;
  1580.  
  1581. function TSourceFileEntry.GetName: string;
  1582. begin
  1583.   Result := BorDebug.Names[NameIndex];
  1584. end;
  1585.  
  1586. function TSourceFileEntry.GetNameIndex: TNameIndex;
  1587. begin
  1588.   Result := SrcModule.NameIndices[SourceFileIndex];
  1589. end;
  1590.  
  1591. function TSourceFileEntry.GetOffset: TFileOffset;
  1592. begin
  1593.   Result := SrcModule.Offset;
  1594. end;
  1595.  
  1596. function TSourceFileEntry.GetRangeCount: TItemCount;
  1597. begin
  1598.   Result := SrcModule.RangeCounts[SourceFileIndex];
  1599. end;
  1600.  
  1601. function TSourceFileEntry.GetRangeLineNumbers(Index: integer): TLineNumberOffsets;
  1602. begin
  1603.   Result := TLineNumberOffsets(FLineNumerOffsetList[Index]);
  1604. end;
  1605.  
  1606. { TLineNumberOffsets }
  1607.  
  1608. constructor TLineNumberOffsets.Create(SourceFile : TSourceFileEntry;
  1609.                                       RangeIndex : TRangeIndex);
  1610. var
  1611.   LineCount: TItemCount;
  1612. begin
  1613.   inherited Create;
  1614.   FSourceFile := SourceFile;
  1615.   FRangeIndex := RangeIndex;
  1616.  
  1617.   LineCount := Self.LineCount;
  1618.   // Allocate enough memory for the line number/offset pairs
  1619.   GetMem(FLineNumbers, LineCount * SizeOf(FLineNumbers^[0]));
  1620.   GetMem(FLineOffsets, LineCount * SizeOf(FLineOffsets^[0]));
  1621.   // Now get the line number/offset pairs
  1622.   BorDebugSrcModuleLineNumbers(SourceFile.Handle, SourceFile.Offset,
  1623.     SourceFile.SourceFileIndex, RangeIndex, FLineNumbers, FLineOffsets);
  1624. end;
  1625.  
  1626. destructor TLineNumberOffsets.Destroy;
  1627. begin
  1628.   FreePtr(FLineOffsets);
  1629.   FreePtr(FLineNumbers);
  1630.   inherited Destroy;
  1631. end;
  1632.  
  1633. function TLineNumberOffsets.GetLineCount: TItemCount;
  1634. begin
  1635.   Result := SourceFile.LineNumberCounts[RangeIndex];
  1636. end;
  1637.  
  1638. { TSymbolInfo }
  1639.  
  1640. constructor TSymbolInfo.Create(BorDebug: TBorDebug; Symbol: TBorDebugSymbol);
  1641. var
  1642.   Handle : TBorDebHandle;
  1643.   TmpName: array[0..255] of char;
  1644. begin
  1645.   inherited Create;
  1646.   FInfoRec.Symbol := Symbol;
  1647.   Handle := BorDebug.Handle;
  1648.   case Kind of
  1649.     BORDEBUG_S_COMPILE   :
  1650.       begin
  1651.         New(FInfoRec.COMPILESymbol);
  1652.         with FInfoRec.COMPILESymbol^ do
  1653.         begin
  1654.           BorDebugSymbolCOMPILE(
  1655.             Handle,
  1656.             SymbolOffset,
  1657.             Machine,
  1658.             Language,
  1659.             Flags,
  1660.             @TmpName,
  1661.             SizeOf(TmpName));
  1662.           GetMem(CompilerName, StrLen(TmpName));
  1663.           StrCopy(CompilerName, TmpName);
  1664.         end;
  1665.       end;
  1666.     BORDEBUG_S_REGISTER  :
  1667.       begin
  1668.         New(FInfoRec.REGISTERSymbol);
  1669.         with FInfoRec.REGISTERSymbol^ do
  1670.         begin
  1671.           BorDebugSymbolREGISTER(
  1672.             Handle,
  1673.             SymbolOffset,
  1674.             TypeIndex,
  1675.             RegisterIndex,
  1676.             NameIndex,
  1677.             BrowserOffset);
  1678.         end;
  1679.       end;
  1680.     BORDEBUG_S_CONST     :
  1681.       begin
  1682.         New(FInfoRec.CONSTSymbol);
  1683.         with FInfoRec.CONSTSymbol^ do
  1684.         begin
  1685.           BorDebugSymbolCONST(
  1686.             Handle,
  1687.             SymbolOffset,
  1688.             TypeIndex,
  1689.             NameIndex,
  1690.             BrowserOffset,
  1691.             Value);
  1692.         end;
  1693.       end;
  1694.     BORDEBUG_S_UDT       :
  1695.       begin
  1696.         New(FInfoRec.UDTSymbol);
  1697.         with FInfoRec.UDTSymbol^ do
  1698.         begin
  1699.           BorDebugSymbolUDT(
  1700.             Handle,
  1701.             SymbolOffset,
  1702.             TypeIndex,
  1703.             Properties,
  1704.             NameIndex,
  1705.             BrowserOffset);
  1706.         end;
  1707.       end;
  1708.     BORDEBUG_S_SSEARCH   :
  1709.       begin
  1710.         New(FInfoRec.SSEARCHSymbol);
  1711.         with FInfoRec.SSEARCHSymbol^ do
  1712.         begin
  1713.           BorDebugSymbolSSEARCH(
  1714.             Handle,
  1715.             SymbolOffset,
  1716.             FirstProcSegment,
  1717.             FirstProcOffset,
  1718.             CodeSymCount,
  1719.             DataSymCount,
  1720.             FirstData);
  1721.          end;
  1722.       end;
  1723.     BORDEBUG_S_OBJNAME   :
  1724.       begin
  1725.         New(FInfoRec.OBJNAMESymbol);
  1726.         with FInfoRec.OBJNAMESymbol^ do
  1727.         begin
  1728.           BorDebugSymbolOBJNAME(
  1729.             Handle,
  1730.             SymbolOffset,
  1731.             Signature,
  1732.             NameIndex);
  1733.         end;
  1734.       end;
  1735.     BORDEBUG_S_GPROCREF  :
  1736.       begin
  1737.         New(FInfoRec.GPROCREFSymbol);
  1738.         with FInfoRec.GPROCREFSymbol^ do
  1739.         begin
  1740.           BorDebugSymbolGPROCREF(
  1741.             Handle,
  1742.             SymbolOffset,
  1743.             RefSymOffset,
  1744.             TypeIndex,
  1745.             NameIndex,
  1746.             BrowserOffset,
  1747.             CodeSegment,
  1748.             CodeOffset);
  1749.         end;
  1750.       end;
  1751.     BORDEBUG_S_GDATAREF  :
  1752.       begin
  1753.         New(FInfoRec.GDATAREFSymbol);
  1754.         with FInfoRec.GDATAREFSymbol^ do
  1755.         begin
  1756.           BorDebugSymbolGDATAREF(
  1757.             Handle,
  1758.             SymbolOffset,
  1759.             RefSymOffset,
  1760.             TypeIndex,
  1761.             NameIndex,
  1762.             BrowserOffset,
  1763.             DataSegment,
  1764.             DataOffset);
  1765.         end;
  1766.       end;  
  1767.     BORDEBUG_S_EDATA     :
  1768.       begin
  1769.         New(FInfoRec.EDATASymbol);
  1770.         with FInfoRec.EDATASymbol^ do
  1771.         begin
  1772.           BorDebugSymbolEDATA(
  1773.             Handle,
  1774.             SymbolOffset,
  1775.             TypeIndex,
  1776.             NameIndex,
  1777.             ExternIndex,
  1778.             Flags,
  1779.             BrowserOffset);
  1780.         end;
  1781.       end;
  1782.     BORDEBUG_S_EPROC     :
  1783.       begin
  1784.         New(FInfoRec.EPROCSymbol);
  1785.         with FInfoRec.EPROCSymbol^ do
  1786.         begin
  1787.           BorDebugSymbolEPROC(
  1788.             Handle,
  1789.             SymbolOffset,
  1790.             TypeIndex,
  1791.             NameIndex,
  1792.             ExternIndex,
  1793.             Flags,
  1794.             BrowserOffset);
  1795.         end;
  1796.       end;  
  1797.     BORDEBUG_S_USES      :
  1798.       begin
  1799.         New(FInfoRec.USESSymbol);
  1800.         with FInfoRec.USESSymbol^ do
  1801.         begin
  1802.           NameCount :=
  1803.             BorDebugSymbolUSES(
  1804.               Handle,
  1805.               SymbolOffset,
  1806.               0,
  1807.               nil);
  1808.           GetMem(NameIndices, NameCount * SizeOf(NameIndices^[0]));
  1809.           BorDebugSymbolUSES(
  1810.             Handle,
  1811.             SymbolOffset,
  1812.             NameCount,
  1813.             NameIndices);
  1814.         end;
  1815.       end;
  1816.     BORDEBUG_S_NAMESPACE :
  1817.       begin
  1818.         New(FInfoRec.NAMESPACESymbol);
  1819.         with FInfoRec.NAMESPACESymbol^ do
  1820.         begin
  1821.           UsingCount :=
  1822.             BorDebugSymbolNAMESPACE(
  1823.               Handle,
  1824.               SymbolOffset,
  1825.               0,
  1826.               NameIndex,
  1827.               BrowserOffset,
  1828.               nil);
  1829.           GetMem(UsingIndices, UsingCount * SizeOf(UsingIndices^[0]));
  1830.           BorDebugSymbolNAMESPACE(
  1831.             Handle,
  1832.             SymbolOffset,
  1833.             UsingCount,
  1834.             NameIndex,
  1835.             BrowserOffset,
  1836.             UsingIndices);
  1837.         end;
  1838.       end;
  1839.     BORDEBUG_S_USING     :
  1840.       begin
  1841.         New(FInfoRec.USINGSymbol);
  1842.         with FInfoRec.USINGSymbol^ do
  1843.         begin
  1844.           NameCount :=
  1845.             BorDebugSymbolUSING(
  1846.               Handle,
  1847.               SymbolOffset,
  1848.               0,
  1849.               nil);
  1850.           GetMem(NameIndices, NameCount * SizeOf(NameIndices^[0]));
  1851.           BorDebugSymbolUSING(
  1852.             Handle,
  1853.             SymbolOffset,
  1854.             NameCount,
  1855.             NameIndices);
  1856.         end;
  1857.       end;
  1858.     BORDEBUG_S_PCONSTANT :
  1859.       begin
  1860.         New(FInfoRec.PCONSTANTSymbol);
  1861.         with FInfoRec.PCONSTANTSymbol^ do
  1862.         begin
  1863. //!!          FillChar(FInfoRec.PCONSTANTSymbol^, SizeOf(FInfoRec.PCONSTANTSymbol^), 0);
  1864.           ValueLen :=
  1865.             BorDebugSymbolPCONSTANT(
  1866.               Handle,
  1867.               SymbolOffset,
  1868.               TypeIndex,
  1869.               NameIndex,
  1870.               Properties,
  1871.               BrowserOffset,
  1872.               SizeOf(TmpName),
  1873.               @TmpName);  // Bug workaround!
  1874.           GetMem(Value, ValueLen);
  1875.           if ValueLen < SizeOf(TmpName) then
  1876.             StrCopy(Value, TmpName)
  1877.           else
  1878.             BorDebugSymbolPCONSTANT(
  1879.               Handle,
  1880.               SymbolOffset,
  1881.               TypeIndex,
  1882.               NameIndex,
  1883.               Properties,
  1884.               BrowserOffset,
  1885.               ValueLen,
  1886.               Value);
  1887.         end;
  1888.       end;
  1889.     BORDEBUG_S_BPREL32   :
  1890.       begin
  1891.         New(FInfoRec.BPREL32Symbol);
  1892.         with FInfoRec.BPREL32Symbol^ do
  1893.         begin
  1894.           BorDebugSymbolBPREL32(
  1895.             Handle,
  1896.             SymbolOffset,
  1897.             EBPOffset,
  1898.             TypeIndex,
  1899.             NameIndex,
  1900.             BrowserOffset);
  1901.         end;
  1902.       end;
  1903.     BORDEBUG_S_LDATA32   :
  1904.       begin
  1905.         New(FInfoRec.LDATA32Symbol);
  1906.         with FInfoRec.LDATA32Symbol^ do
  1907.         begin
  1908.           BorDebugSymbolLDATA32(
  1909.             Handle,
  1910.             SymbolOffset,
  1911.             Offset,
  1912.             Segment,
  1913.             Flags,
  1914.             TypeIndex,
  1915.             NameIndex,
  1916.             BrowserOffset);
  1917.         end;
  1918.       end;
  1919.     BORDEBUG_S_GDATA32   :
  1920.       begin
  1921.         New(FInfoRec.GDATA32Symbol);
  1922.         with FInfoRec.GDATA32Symbol^ do
  1923.         begin
  1924.           BorDebugSymbolGDATA32(
  1925.             Handle,
  1926.             SymbolOffset,
  1927.             Offset,
  1928.             Segment,
  1929.             Flags,
  1930.             TypeIndex,
  1931.             NameIndex,
  1932.             BrowserOffset);
  1933.         end;
  1934.       end;
  1935.     BORDEBUG_S_PUB32     :
  1936.       begin
  1937.         New(FInfoRec.PUB32Symbol);
  1938.         with FInfoRec.PUB32Symbol^ do
  1939.         begin
  1940.           BorDebugSymbolPUB32(
  1941.             Handle,
  1942.             SymbolOffset,
  1943.             Offset,
  1944.             Segment,
  1945.             Flags,
  1946.             TypeIndex,
  1947.             NameIndex,
  1948.             BrowserOffset);
  1949.         end;
  1950.       end;
  1951.     BORDEBUG_S_LPROC32   :
  1952.       begin
  1953.         New(FInfoRec.LPROC32Symbol);
  1954.         with FInfoRec.LPROC32Symbol^ do
  1955.         begin
  1956.           BorDebugSymbolLPROC32(
  1957.             Handle,
  1958.             SymbolOffset,
  1959.             Parent,
  1960.             End_,
  1961.             Next,
  1962.             CodeLength,
  1963.             DebugStart,
  1964.             DebugEnd,
  1965.             Offset,
  1966.             Segment,
  1967.             Flags,
  1968.             TypeIndex,
  1969.             NameIndex,
  1970.             BrowserOffset);
  1971.         end;
  1972.       end;
  1973.     BORDEBUG_S_GPROC32   :
  1974.       begin
  1975.         New(FInfoRec.GPROC32Symbol);
  1976.         with FInfoRec.GPROC32Symbol^ do
  1977.         begin
  1978.           LinkNameLen :=
  1979.             BorDebugSymbolGPROC32(
  1980.               Handle,
  1981.               SymbolOffset,
  1982.               Parent,
  1983.               End_,
  1984.               Next,
  1985.               CodeLength,
  1986.               DebugStart,
  1987.               DebugEnd,
  1988.               Offset,
  1989.               Segment,
  1990.               Flags,
  1991.               TypeIndex,
  1992.               NameIndex,
  1993.               BrowserOffset,
  1994.               nil,
  1995.               0);
  1996.           GetMem(LinkName, LinkNameLen);
  1997.           BorDebugSymbolGPROC32(
  1998.             Handle,
  1999.             SymbolOffset,
  2000.             Parent,
  2001.             End_,
  2002.             Next,
  2003.             CodeLength,
  2004.             DebugStart,
  2005.             DebugEnd,
  2006.             Offset,
  2007.             Segment,
  2008.             Flags,
  2009.             TypeIndex,
  2010.             NameIndex,
  2011.             BrowserOffset,
  2012.             LinkName,
  2013.             LinkNameLen);
  2014.         end;
  2015.       end;
  2016.     BORDEBUG_S_THUNK32   :
  2017.       begin
  2018.         New(FInfoRec.THUNK32Symbol);
  2019.         with FInfoRec.THUNK32Symbol^ do
  2020.         begin
  2021.           BorDebugSymbolTHUNK32(
  2022.             Handle,
  2023.             SymbolOffset,
  2024.             Parent,
  2025.             End_,
  2026.             Next,
  2027.             Offset,
  2028.             Segment,
  2029.             CodeLength,
  2030.             Ordinal,
  2031.             NameIndex,
  2032.             Delta);
  2033.         end;
  2034.       end;
  2035.     BORDEBUG_S_BLOCK32   :
  2036.       begin
  2037.         New(FInfoRec.BLOCK32Symbol);
  2038.         with FInfoRec.BLOCK32Symbol^ do
  2039.         begin
  2040.           BorDebugSymbolBLOCK32(
  2041.             Handle,
  2042.             SymbolOffset,
  2043.             Parent,
  2044.             End_,
  2045.             CodeLength,
  2046.             Offset,
  2047.             Segment,
  2048.             NameIndex);
  2049.         end;
  2050.       end;
  2051.     BORDEBUG_S_WITH32    :
  2052.       begin
  2053.         New(FInfoRec.WITH32Symbol);
  2054.         with FInfoRec.WITH32Symbol^ do
  2055.         begin
  2056.           BorDebugSymbolWITH32(
  2057.             Handle,
  2058.             SymbolOffset,
  2059.             Parent,
  2060.             CodeLength,
  2061.             Offset,
  2062.             Segment,
  2063.             Flags,
  2064.             TypeIndex,
  2065.             NameIndex,
  2066.             VarOffset);
  2067.         end;
  2068.       end;
  2069.     BORDEBUG_S_LABEL32   :
  2070.       begin
  2071.         New(FInfoRec.LABEL32Symbol);
  2072.         with FInfoRec.LABEL32Symbol^ do
  2073.         begin
  2074.           BorDebugSymbolLABEL32(
  2075.             Handle,
  2076.             SymbolOffset,
  2077.             Offset,
  2078.             Segment,
  2079.             NearFar,
  2080.             NameIndex);
  2081.         end;
  2082.       end;
  2083.     BORDEBUG_S_ENTRY32   :
  2084.       begin
  2085.         New(FInfoRec.ENTRY32Symbol);
  2086.         with FInfoRec.ENTRY32Symbol^ do
  2087.         begin
  2088.           BorDebugSymbolENTRY32(
  2089.             Handle,
  2090.             SymbolOffset,
  2091.             Offset,
  2092.             Segment);
  2093.         end;
  2094.       end;
  2095.     BORDEBUG_S_OPTVAR32  :
  2096.       begin
  2097.         New(FInfoRec.OPTVAR32Symbol);
  2098.         with FInfoRec.OPTVAR32Symbol^ do
  2099.         begin
  2100.           EntryCount :=
  2101.             BorDebugSymbolOPTVAR32(
  2102.               Handle,
  2103.               SymbolOffset,
  2104.               0,
  2105.               nil,
  2106.               nil,
  2107.               nil);
  2108.           GetMem(StartEntries  , EntryCount * SizeOf(StartEntries  ^[0]));
  2109.           GetMem(LengthEntries , EntryCount * SizeOf(LengthEntries ^[0]));
  2110.           GetMem(RegNameEntries, EntryCount * SizeOf(RegNameEntries^[0]));
  2111.           BorDebugSymbolOPTVAR32(
  2112.             Handle,
  2113.             SymbolOffset,
  2114.             EntryCount,
  2115.             StartEntries,
  2116.             LengthEntries,
  2117.             RegNameEntries);
  2118.         end;
  2119.       end;
  2120.     BORDEBUG_S_PROCRET32 :
  2121.       begin
  2122.         New(FInfoRec.PROCRET32Symbol);
  2123.         with FInfoRec.PROCRET32Symbol^ do
  2124.         begin
  2125.           BorDebugSymbolPROCRET32(
  2126.             Handle,
  2127.             SymbolOffset,
  2128.             Offset,
  2129.             Length);
  2130.         end;
  2131.       end;
  2132.     BORDEBUG_S_SAVREGS32 :
  2133.       begin
  2134.         New(FInfoRec.SAVREGS32Symbol);
  2135.         with FInfoRec.SAVREGS32Symbol^ do
  2136.         begin
  2137.           BorDebugSymbolSAVREGS32(
  2138.             Handle,
  2139.             SymbolOffset,
  2140.             Mask,
  2141.             EBPOffset);
  2142.         end;
  2143.       end;
  2144.     BORDEBUG_S_SLINK32   :
  2145.       begin
  2146.         New(FInfoRec.SLINK32Symbol);
  2147.         with FInfoRec.SLINK32Symbol^ do
  2148.         begin
  2149.           EBPOffset :=
  2150.           BorDebugSymbolSLINK32(
  2151.             Handle,
  2152.             SymbolOffset);
  2153.         end;
  2154.       end;
  2155.   end;
  2156. end;
  2157.  
  2158. destructor TSymbolInfo.Destroy;
  2159. begin
  2160.   case Kind of
  2161.     BORDEBUG_S_COMPILE   :
  2162.       begin
  2163.         FreeMem(FInfoRec.COMPILESymbol.CompilerName);
  2164.         Dispose(FInfoRec.COMPILESymbol);
  2165.       end;
  2166.     BORDEBUG_S_REGISTER  :
  2167.       begin
  2168.         Dispose(FInfoRec.REGISTERSymbol);
  2169.       end;
  2170.     BORDEBUG_S_CONST     :
  2171.       begin
  2172.         Dispose(FInfoRec.CONSTSymbol);
  2173.       end;
  2174.     BORDEBUG_S_UDT       :
  2175.       begin
  2176.         Dispose(FInfoRec.UDTSymbol);
  2177.       end;
  2178.     BORDEBUG_S_SSEARCH   :
  2179.       begin
  2180.         Dispose(FInfoRec.SSEARCHSymbol);
  2181.       end;
  2182.     BORDEBUG_S_OBJNAME   :
  2183.       begin
  2184.         Dispose(FInfoRec.OBJNAMESymbol);
  2185.       end;
  2186.     BORDEBUG_S_GPROCREF  :
  2187.       begin
  2188.         Dispose(FInfoRec.GPROCREFSymbol);
  2189.       end;
  2190.     BORDEBUG_S_GDATAREF  :
  2191.       begin
  2192.         Dispose(FInfoRec.GDATAREFSymbol);
  2193.       end;
  2194.     BORDEBUG_S_EDATA     :
  2195.       begin
  2196.         Dispose(FInfoRec.EDATASymbol);
  2197.       end;
  2198.     BORDEBUG_S_EPROC     :
  2199.       begin
  2200.         Dispose(FInfoRec.EPROCSymbol);
  2201.       end;
  2202.     BORDEBUG_S_USES      :
  2203.       begin
  2204.         FreeMem(FInfoRec.USESSymbol^.NameIndices);
  2205.         Dispose(FInfoRec.USESSymbol);
  2206.       end;
  2207.     BORDEBUG_S_NAMESPACE :
  2208.       begin
  2209.         FreeMem(FInfoRec.NAMESPACESymbol^.UsingIndices);
  2210.         Dispose(FInfoRec.NAMESPACESymbol);
  2211.       end;
  2212.     BORDEBUG_S_USING     :
  2213.       begin
  2214.         FreeMem(FInfoRec.USINGSymbol^.NameIndices);
  2215.         Dispose(FInfoRec.USINGSymbol);
  2216.       end;
  2217.     BORDEBUG_S_PCONSTANT :
  2218.       begin
  2219.         FreeMem(FInfoRec.PCONSTANTSymbol^.Value);
  2220.         Dispose(FInfoRec.PCONSTANTSymbol);
  2221.       end;
  2222.     BORDEBUG_S_BPREL32   :
  2223.       begin
  2224.         Dispose(FInfoRec.BPREL32Symbol);
  2225.       end;
  2226.     BORDEBUG_S_LDATA32   :
  2227.       begin
  2228.         Dispose(FInfoRec.LDATA32Symbol);
  2229.       end;
  2230.     BORDEBUG_S_GDATA32   :
  2231.       begin
  2232.         Dispose(FInfoRec.GDATA32Symbol);
  2233.       end;
  2234.     BORDEBUG_S_PUB32     :
  2235.       begin
  2236.         Dispose(FInfoRec.PUB32Symbol);
  2237.       end;
  2238.     BORDEBUG_S_LPROC32   :
  2239.       begin
  2240.         Dispose(FInfoRec.LPROC32Symbol);
  2241.       end;
  2242.     BORDEBUG_S_GPROC32   :
  2243.       begin
  2244.         FreeMem(FInfoRec.GPROC32Symbol^.LinkName);
  2245.         Dispose(FInfoRec.GPROC32Symbol);
  2246.       end;
  2247.     BORDEBUG_S_THUNK32   :
  2248.       begin
  2249.         Dispose(FInfoRec.THUNK32Symbol);
  2250.       end;
  2251.     BORDEBUG_S_BLOCK32   :
  2252.       begin
  2253.         Dispose(FInfoRec.BLOCK32Symbol);
  2254.       end;
  2255.     BORDEBUG_S_WITH32    :
  2256.       begin
  2257.         Dispose(FInfoRec.WITH32Symbol);
  2258.       end;
  2259.     BORDEBUG_S_LABEL32   :
  2260.       begin
  2261.         Dispose(FInfoRec.LABEL32Symbol);
  2262.       end;
  2263.     BORDEBUG_S_ENTRY32   :
  2264.       begin
  2265.         Dispose(FInfoRec.ENTRY32Symbol);
  2266.       end;
  2267.     BORDEBUG_S_OPTVAR32  :
  2268.       begin
  2269.         FreeMem(FInfoRec.OPTVAR32Symbol^.StartEntries  );
  2270.         FreeMem(FInfoRec.OPTVAR32Symbol^.LengthEntries );
  2271.         FreeMem(FInfoRec.OPTVAR32Symbol^.RegNameEntries);
  2272.         Dispose(FInfoRec.OPTVAR32Symbol);
  2273.       end;
  2274.     BORDEBUG_S_PROCRET32 :
  2275.       begin
  2276.         Dispose(FInfoRec.PROCRET32Symbol);
  2277.       end;
  2278.     BORDEBUG_S_SAVREGS32 :
  2279.       begin
  2280.         Dispose(FInfoRec.SAVREGS32Symbol);
  2281.       end;
  2282.     BORDEBUG_S_SLINK32   :
  2283.       begin
  2284.         Dispose(FInfoRec.SLINK32Symbol);
  2285.       end;
  2286.   end;
  2287.   // We could have avoided all the Dispose-calls above by doing:
  2288.   //
  2289.   // FreeMem(FInfoRec.SymbolPtr)
  2290.   //
  2291.   // But if we later add strings, variants, interfaces or other auto-managed
  2292.   // fields that must be finalized, the code would break (i.e. leak)
  2293.   FInfoRec.SymbolPtr := nil;
  2294.   inherited Destroy;
  2295. end;
  2296.  
  2297. function TSymbolInfo.GetTypeIndex(var TypeIndex: TTypeIndex): boolean;
  2298. begin
  2299.   Result := True;
  2300.   case Kind of
  2301.     BORDEBUG_S_REGISTER  : TypeIndex := FInfoRec.REGISTERSymbol^.TypeIndex;
  2302.     BORDEBUG_S_CONST     : TypeIndex := FInfoRec.CONSTSymbol^.TypeIndex;
  2303.     BORDEBUG_S_UDT       : TypeIndex := FInfoRec.UDTSymbol^.TypeIndex;
  2304.     BORDEBUG_S_GPROCREF  : TypeIndex := FInfoRec.GPROCREFSymbol^.TypeIndex;
  2305.     BORDEBUG_S_GDATAREF  : TypeIndex := FInfoRec.GDATAREFSymbol^.TypeIndex;
  2306.     BORDEBUG_S_EDATA     : TypeIndex := FInfoRec.EDATASymbol^.TypeIndex;
  2307.     BORDEBUG_S_EPROC     : TypeIndex := FInfoRec.EPROCSymbol^.TypeIndex;
  2308.     BORDEBUG_S_PCONSTANT : TypeIndex := FInfoRec.PCONSTANTSymbol^.TypeIndex;
  2309.     BORDEBUG_S_BPREL32   : TypeIndex := FInfoRec.BPREL32Symbol^.TypeIndex;
  2310.     BORDEBUG_S_LDATA32   : TypeIndex := FInfoRec.LDATA32Symbol^.TypeIndex;
  2311.     BORDEBUG_S_GDATA32   : TypeIndex := FInfoRec.GDATA32Symbol^.TypeIndex;
  2312.     BORDEBUG_S_PUB32     : TypeIndex := FInfoRec.PUB32Symbol^.TypeIndex;
  2313.     BORDEBUG_S_LPROC32   : TypeIndex := FInfoRec.LPROC32Symbol^.TypeIndex;
  2314.     BORDEBUG_S_GPROC32   : TypeIndex := FInfoRec.GPROC32Symbol^.TypeIndex;
  2315.     BORDEBUG_S_WITH32    : TypeIndex := FInfoRec.WITH32Symbol^.TypeIndex;
  2316.     else                   Result := False;
  2317.   end;
  2318. end;
  2319.  
  2320. function TSymbolInfo.GetNameIndex(var NameIndex: TNameIndex): boolean;
  2321. begin
  2322.   Result := True;
  2323.   case Kind of
  2324.     BORDEBUG_S_REGISTER  : NameIndex := FInfoRec.REGISTERSymbol^.NameIndex;
  2325.     BORDEBUG_S_CONST     : NameIndex := FInfoRec.CONSTSymbol^.NameIndex;
  2326.     BORDEBUG_S_UDT       : NameIndex := FInfoRec.UDTSymbol^.NameIndex;
  2327.     BORDEBUG_S_OBJNAME   : NameIndex := FInfoRec.OBJNAMESymbol^.NameIndex;
  2328.     BORDEBUG_S_GPROCREF  : NameIndex := FInfoRec.GPROCREFSymbol^.NameIndex;
  2329.     BORDEBUG_S_GDATAREF  : NameIndex := FInfoRec.GDATAREFSymbol^.NameIndex;
  2330.     BORDEBUG_S_EDATA     : NameIndex := FInfoRec.EDATASymbol^.NameIndex;
  2331.     BORDEBUG_S_EPROC     : NameIndex := FInfoRec.EPROCSymbol^.NameIndex;
  2332.     BORDEBUG_S_NAMESPACE : NameIndex := FInfoRec.NAMESPACESymbol^.NameIndex;
  2333.     BORDEBUG_S_PCONSTANT : NameIndex := FInfoRec.PCONSTANTSymbol^.NameIndex;
  2334.     BORDEBUG_S_BPREL32   : NameIndex := FInfoRec.BPREL32Symbol^.NameIndex;
  2335.     BORDEBUG_S_LDATA32   : NameIndex := FInfoRec.LDATA32Symbol^.NameIndex;
  2336.     BORDEBUG_S_GDATA32   : NameIndex := FInfoRec.GDATA32Symbol^.NameIndex;
  2337.     BORDEBUG_S_PUB32     : NameIndex := FInfoRec.PUB32Symbol^.NameIndex;
  2338.     BORDEBUG_S_LPROC32   : NameIndex := FInfoRec.LPROC32Symbol^.NameIndex;
  2339.     BORDEBUG_S_GPROC32   : NameIndex := FInfoRec.GPROC32Symbol^.NameIndex;
  2340.     BORDEBUG_S_THUNK32   : NameIndex := FInfoRec.THUNK32Symbol^.NameIndex;
  2341.     BORDEBUG_S_BLOCK32   : NameIndex := FInfoRec.BLOCK32Symbol^.NameIndex;
  2342.     BORDEBUG_S_WITH32    : NameIndex := FInfoRec.WITH32Symbol^.NameIndex;
  2343.     BORDEBUG_S_LABEL32   : NameIndex := FInfoRec.LABEL32Symbol^.NameIndex;
  2344.     else                   Result := False;
  2345.   end;
  2346. end;
  2347.  
  2348. function TSymbolInfo.GetKindAsString: string;
  2349. begin
  2350.   Result := SymbolKindToString(Kind);
  2351. end;
  2352.  
  2353. { TTypeInfo }
  2354.  
  2355. constructor TTypeInfo.Create(BorDebug: TBorDebug; aType: TBorDebugType);
  2356. var
  2357.   Handle : TBorDebHandle;
  2358.   TmpName: array[0..255] of char;
  2359. begin
  2360.   inherited Create;
  2361.   FInfoRec.BDType := aType;
  2362.   Handle := BorDebug.Handle;
  2363.   case TypeKind of
  2364.     BORDEBUG_LF_MODIFIER    :
  2365.       begin
  2366.         New(FInfoRec.MODIFIERType);
  2367.         with FInfoRec.MODIFIERType^ do
  2368.         begin
  2369.           BorDebugTypeMODIFIER(
  2370.             Handle,
  2371.             TypeOffset,
  2372.             Attributes,
  2373.             TypeIndex);
  2374.         end;
  2375.       end;
  2376.     BORDEBUG_LF_POINTER     :
  2377.       begin
  2378.         New(FInfoRec.POINTERType);
  2379.         with FInfoRec.POINTERType^ do
  2380.         begin
  2381.           BorDebugTypePOINTER(
  2382.             Handle,
  2383.             TypeOffset,
  2384.             Attributes,
  2385.             TypeIndex,
  2386.             Value1,
  2387.             Value2);
  2388.         end;
  2389.       end;      
  2390.     BORDEBUG_LF_ARRAY       :
  2391.       begin
  2392.         New(FInfoRec.ARRAYType);
  2393.         with FInfoRec.ARRAYType^ do
  2394.         begin
  2395.           BorDebugTypeARRAY(
  2396.             Handle,
  2397.             TypeOffset,
  2398.             ElementType,
  2399.             IndexType,
  2400.             NameIndex,
  2401.             Size,
  2402.             Elements);
  2403.         end;
  2404.       end;
  2405.     BORDEBUG_LF_STRUCT,
  2406.     BORDEBUG_LF_CLASS       :
  2407.       begin
  2408.         New(FInfoRec.CLASSType);
  2409.         with FInfoRec.CLASSType^ do
  2410.         begin
  2411.           BorDebugTypeCLASS(
  2412.             Handle,
  2413.             TypeOffset,
  2414.             FieldCount,
  2415.             FieldList,
  2416.             ClassFlags,
  2417.             ContainingClass,
  2418.             DerivationList,
  2419.             Vtable,
  2420.             NameIndex,
  2421.             ClassSize);
  2422.         end;
  2423.       end;
  2424.     BORDEBUG_LF_UNION       :
  2425.       begin
  2426.         New(FInfoRec.UNIONType);
  2427.         with FInfoRec.UNIONType^ do
  2428.         begin
  2429.           BorDebugTypeUNION(
  2430.             Handle,
  2431.             TypeOffset,
  2432.             FieldCount,
  2433.             FieldList,
  2434.             ClassFlags,
  2435.             ContainingClass,
  2436.             NameIndex,
  2437.             ClassSize);
  2438.         end;
  2439.       end;
  2440.     BORDEBUG_LF_ENUM        :
  2441.       begin
  2442.         New(FInfoRec.ENUMType);
  2443.         with FInfoRec.ENUMType^ do
  2444.         begin
  2445.           BorDebugTypeENUM(
  2446.             Handle,
  2447.             TypeOffset,
  2448.             MemberCount,
  2449.             UnderlyingType,
  2450.             MemberList,
  2451.             ContainingClass,
  2452.             NameIndex);
  2453.         end;
  2454.       end;
  2455.     BORDEBUG_LF_PROCEDURE   :
  2456.       begin
  2457.         New(FInfoRec.PROCEDUREType);
  2458.         with FInfoRec.PROCEDUREType^ do
  2459.         begin
  2460.           BorDebugTypePROCEDURE(
  2461.             Handle,
  2462.             TypeOffset,
  2463.             ReturnType,
  2464.             CallingConvention,
  2465.             ArgCount,
  2466.             ArgList);
  2467.         end;
  2468.       end;
  2469.     BORDEBUG_LF_MFUNCTION   :
  2470.       begin
  2471.         New(FInfoRec.MFUNCTIONType);
  2472.         with FInfoRec.MFUNCTIONType^ do
  2473.         begin
  2474.           BorDebugTypeMFUNCTION(
  2475.             Handle,
  2476.             TypeOffset,
  2477.             ReturnType,
  2478.             ClassType,
  2479.             ThisType,
  2480.             CallingConvention,
  2481.             ArgCount,
  2482.             ArgList,
  2483.             ThisAdjust);
  2484.         end;
  2485.       end;
  2486.     BORDEBUG_LF_VTSHAPE     :
  2487.       begin
  2488.         New(FInfoRec.VTSHAPEType);
  2489.         with FInfoRec.VTSHAPEType^ do
  2490.         begin
  2491.           DescriptorCount :=
  2492.             BorDebugTypeVTSHAPE(
  2493.               Handle,
  2494.               TypeOffset,
  2495.               0,
  2496.               nil);
  2497.           GetMem(DescriptorArray, DescriptorCount * SizeOf(DescriptorArray^[0]));
  2498.           BorDebugTypeVTSHAPE(
  2499.             Handle,
  2500.             TypeOffset,
  2501.             DescriptorCount,
  2502.             DescriptorArray);
  2503.         end;
  2504.       end;
  2505.     BORDEBUG_LF_LABEL       :
  2506.       begin
  2507.         New(FInfoRec.LABELType);
  2508.         with FInfoRec.LABELType^ do
  2509.         begin
  2510.           NearFar :=
  2511.             BorDebugTypeLABEL(
  2512.               Handle,
  2513.               TypeOffset);
  2514.         end;
  2515.       end;
  2516.     BORDEBUG_LF_SET         :
  2517.       begin
  2518.         New(FInfoRec.SETType);
  2519.         with FInfoRec.SETType^ do
  2520.         begin
  2521.           BorDebugTypeSET(
  2522.             Handle,
  2523.             TypeOffset,
  2524.             ElemType,
  2525.             NameIndex,
  2526.             LowByte,
  2527.             Length);
  2528.         end;
  2529.       end;
  2530.     BORDEBUG_LF_SUBRANGE    :
  2531.       begin
  2532.         New(FInfoRec.SUBRANGEType);
  2533.         with FInfoRec.SUBRANGEType^ do
  2534.         begin
  2535.           BorDebugTypeSUBRANGE(
  2536.             Handle,
  2537.             TypeOffset,
  2538.             BaseType,
  2539.             NameIndex,
  2540.             LoBound,
  2541.             HiBound,
  2542.             Size);
  2543.         end;
  2544.       end;
  2545.     BORDEBUG_LF_PARRAY      :
  2546.       begin
  2547.         New(FInfoRec.PARRAYType);
  2548.         with FInfoRec.PARRAYType^ do
  2549.         begin
  2550.           BorDebugTypePARRAY(
  2551.             Handle,
  2552.             TypeOffset,
  2553.             ElementType,
  2554.             IndexType,
  2555.             NameIndex,
  2556.             Size,
  2557.             Elements);
  2558.         end;
  2559.       end;
  2560.     BORDEBUG_LF_PSTRING     :
  2561.       begin
  2562.         New(FInfoRec.PSTRINGType);
  2563.         with FInfoRec.PSTRINGType^ do
  2564.         begin
  2565.           BorDebugTypePSTRING(
  2566.             Handle,
  2567.             TypeOffset,
  2568.             ElemType,
  2569.             IndexType,
  2570.             NameIndex);
  2571.         end;
  2572.       end;
  2573.     BORDEBUG_LF_CLOSURE     :
  2574.       begin
  2575.         New(FInfoRec.CLOSUREType);
  2576.         with FInfoRec.CLOSUREType^ do
  2577.         begin
  2578.           BorDebugTypeCLOSURE(
  2579.             Handle,
  2580.             TypeOffset,
  2581.             ReturnType,
  2582.             CallingConvention,
  2583.             ArgCount,
  2584.             ArgList);
  2585.         end;
  2586.       end;
  2587.     BORDEBUG_LF_PROPERTY    :
  2588.       begin
  2589.         New(FInfoRec.PROPERTYType);
  2590.         with FInfoRec.PROPERTYType^ do
  2591.         begin
  2592.           BorDebugTypePROPERTY(
  2593.             Handle,
  2594.             TypeOffset,
  2595.             TypeIndex,
  2596.             Flags,
  2597.             ArrayIndex,
  2598.             PropIndex,
  2599.             ReadSlot,
  2600.             WriteSlot);
  2601.         end;
  2602.       end;
  2603.     BORDEBUG_LF_LSTRING     :
  2604.       begin
  2605.         New(FInfoRec.LSTRINGType);
  2606.         with FInfoRec.LSTRINGType^ do
  2607.         begin
  2608.           NameIndex :=
  2609.             BorDebugTypeLSTRING(
  2610.               Handle,
  2611.               TypeOffset);
  2612.         end;
  2613.       end;
  2614.     BORDEBUG_LF_VARIANT     :
  2615.       begin
  2616.         New(FInfoRec.VARIANTType);
  2617.         with FInfoRec.VARIANTType^ do
  2618.         begin
  2619.           NameIndex :=
  2620.             BorDebugTypeVARIANT(
  2621.               Handle,
  2622.               TypeOffset);
  2623.         end;
  2624.       end;
  2625.     BORDEBUG_LF_CLASSREF    :
  2626.       begin
  2627.         New(FInfoRec.CLASSREFType);
  2628.         with FInfoRec.CLASSREFType^ do
  2629.         begin
  2630.           BorDebugTypeCLASSREF(
  2631.             Handle,
  2632.             TypeOffset,
  2633.             RefType,
  2634.             VtShape);
  2635.         end;
  2636.       end;
  2637.     BORDEBUG_LF_WSTRING     :
  2638.       begin
  2639.         New(FInfoRec.WSTRINGType);
  2640.         with FInfoRec.WSTRINGType^ do
  2641.         begin
  2642.           NameIndex :=
  2643.             BorDebugTypeWSTRING(
  2644.               Handle,
  2645.               TypeOffset);
  2646.         end;
  2647.       end;
  2648.     BORDEBUG_LF_ARGLIST     :
  2649.       begin
  2650.         New(FInfoRec.ARGLISTType);
  2651.         with FInfoRec.ARGLISTType^ do
  2652.         begin
  2653.           TypeCount :=
  2654.             BorDebugTypeARGLIST(
  2655.               Handle,
  2656.               TypeOffset,
  2657.               0,
  2658.               nil);
  2659.           GetMem(TypeArray, TypeCount * SizeOf(TypeArray^[0]));
  2660.           BorDebugTypeARGLIST(
  2661.             Handle,
  2662.             TypeOffset,
  2663.             TypeCount,
  2664.             TypeArray);
  2665.         end;
  2666.       end;
  2667.     BORDEBUG_LF_DERIVED     :
  2668.       begin
  2669.         New(FInfoRec.DERIVEDType);
  2670.         with FInfoRec.DERIVEDType^ do
  2671.         begin
  2672.           TypeCount :=
  2673.             BorDebugTypeDERIVED(
  2674.               Handle,
  2675.               TypeOffset,
  2676.               0,
  2677.               nil);
  2678.           GetMem(DerivedTypes, TypeCount * SizeOf(DerivedTypes^[0]));
  2679.           BorDebugTypeDERIVED(
  2680.             Handle,
  2681.             TypeOffset,
  2682.             TypeCount,
  2683.             DerivedTypes);
  2684.         end;
  2685.       end;
  2686.     BORDEBUG_LF_BITFIELD    :
  2687.       begin
  2688.         New(FInfoRec.BITFIELDType);
  2689.         with FInfoRec.BITFIELDType^ do
  2690.         begin
  2691.           BorDebugTypeBITFIELD(
  2692.             Handle,
  2693.             TypeOffset,
  2694.             Length,
  2695.             Position,
  2696.             TypeIndex);
  2697.         end;
  2698.       end;
  2699.     BORDEBUG_LF_METHODLIST  :
  2700.       begin
  2701.         New(FInfoRec.METHODLISTType);
  2702.         with FInfoRec.METHODLISTType^ do
  2703.         begin
  2704.           MethodCount :=
  2705.             BorDebugTypeMETHODLIST(
  2706.               Handle,
  2707.               TypeOffset,
  2708.               0,
  2709.               nil,
  2710.               nil,
  2711.               nil,
  2712.               nil);
  2713.           GetMem(TypeArray, MethodCount * SizeOf(TypeArray^[0]));
  2714.           GetMem(AttribArray, MethodCount * SizeOf(AttribArray^[0]));
  2715.           GetMem(BrowserArray, MethodCount * SizeOf(BrowserArray^[0]));
  2716.           GetMem(VtabOffArray, MethodCount * SizeOf(VtabOffArray^[0]));
  2717.           BorDebugTypeMETHODLIST(
  2718.             Handle,
  2719.             TypeOffset,
  2720.             MethodCount,
  2721.             TypeArray,
  2722.             AttribArray,
  2723.             BrowserArray,
  2724.             VtabOffArray);
  2725.         end;
  2726.       end;
  2727.     BORDEBUG_LF_BCLASS      :
  2728.       begin
  2729.         New(FInfoRec.BCLASSType);
  2730.         with FInfoRec.BCLASSType^ do
  2731.         begin
  2732.           BorDebugTypeBCLASS(
  2733.             Handle,
  2734.             TypeOffset,
  2735.             BaseType,
  2736.             Attrib,
  2737.             Offset);
  2738.         end;
  2739.       end;
  2740.     BORDEBUG_LF_VBCLASS     :
  2741.       begin
  2742.         New(FInfoRec.VBCLASSType);
  2743.         with FInfoRec.VBCLASSType^ do
  2744.         begin
  2745.           BorDebugTypeVBCLASS(
  2746.             Handle,
  2747.             TypeOffset,
  2748.             vbType,
  2749.             vbpType,
  2750.             Attrib,
  2751.             VbpOffset,
  2752.             Offset);
  2753.         end;
  2754.       end;
  2755.     BORDEBUG_LF_IVBCLASS    :
  2756.       begin
  2757.         New(FInfoRec.IVBCLASSType);
  2758.         with FInfoRec.IVBCLASSType^ do
  2759.         begin
  2760.           BorDebugTypeIVBCLASS(
  2761.             Handle,
  2762.             TypeOffset,
  2763.             vbType,
  2764.             vbpType,
  2765.             Attrib,
  2766.             VbpOffset,
  2767.             Offset);
  2768.         end;
  2769.       end;
  2770.     BORDEBUG_LF_ENUMERATE   :
  2771.       begin
  2772.         New(FInfoRec.ENUMERATEType);
  2773.         with FInfoRec.ENUMERATEType^ do
  2774.         begin
  2775.           BorDebugTypeENUMERATE(
  2776.             Handle,
  2777.             TypeOffset,
  2778.             Attrib,
  2779.             NameIndex,
  2780.             BrowserOffset,
  2781.             Value);
  2782.         end;
  2783.       end;
  2784.     BORDEBUG_LF_FRIENDFCN   :
  2785.       begin
  2786.         New(FInfoRec.FRIENDFCNType);
  2787.         with FInfoRec.FRIENDFCNType^ do
  2788.         begin
  2789.           BorDebugTypeFRIENDFCN(
  2790.             Handle,
  2791.             TypeOffset,
  2792.             TypeIndex,
  2793.             NameIndex);
  2794.         end;
  2795.       end;
  2796.     BORDEBUG_LF_INDEX       :
  2797.       begin
  2798.         New(FInfoRec.INDEXTypeR);
  2799.         with FInfoRec.INDEXTypeR^ do
  2800.         begin
  2801.           TypeIndex :=
  2802.             BorDebugTypeINDEX(
  2803.               Handle,
  2804.               TypeOffset);
  2805.         end;
  2806.       end;
  2807.     BORDEBUG_LF_MEMBER      :
  2808.       begin
  2809.         New(FInfoRec.MEMBERType);
  2810.         with FInfoRec.MEMBERType^ do
  2811.         begin
  2812.           BorDebugTypeMEMBER(
  2813.             Handle,
  2814.             TypeOffset,
  2815.             TypeIndex,
  2816.             Attrib,
  2817.             NameIndex,
  2818.             Offset,
  2819.             BrowserOffset);
  2820.         end;
  2821.       end;
  2822.     BORDEBUG_LF_STMEMBER    :
  2823.       begin
  2824.         New(FInfoRec.STMEMBERType);
  2825.         with FInfoRec.STMEMBERType^ do
  2826.         begin
  2827.           BorDebugTypeSTMEMBER(
  2828.             Handle,
  2829.             TypeOffset,
  2830.             TypeIndex,
  2831.             Attrib,
  2832.             NameIndex,
  2833.             BrowserOffset);
  2834.         end;
  2835.       end;
  2836.     BORDEBUG_LF_METHOD      :
  2837.       begin
  2838.         New(FInfoRec.METHODType);
  2839.         with FInfoRec.METHODType^ do
  2840.         begin
  2841.           BorDebugTypeMETHOD(
  2842.             Handle,
  2843.             TypeOffset,
  2844.             OverloadedCount,
  2845.             MethodList,
  2846.             NameIndex);
  2847.         end;
  2848.       end;
  2849.     BORDEBUG_LF_NESTTYPE    :
  2850.       begin
  2851.         New(FInfoRec.NESTTYPEType);
  2852.         with FInfoRec.NESTTYPEType^ do
  2853.         begin
  2854.           BorDebugTypeNESTTYPE(
  2855.             Handle,
  2856.             TypeOffset,
  2857.             TypeIndex,
  2858.             NameIndex,
  2859.             BrowserOffset);
  2860.         end;
  2861.       end;
  2862.     BORDEBUG_LF_VFUNCTAB    :
  2863.       begin
  2864.         New(FInfoRec.VFUNCTABType);
  2865.         with FInfoRec.VFUNCTABType^ do
  2866.         begin
  2867.           BorDebugTypeVFUNCTAB(
  2868.             Handle,
  2869.             TypeOffset,
  2870.             TypeIndex,
  2871.             Offset);
  2872.         end;
  2873.       end;
  2874.     BORDEBUG_LF_FRIENDCLS   :
  2875.       begin
  2876.         New(FInfoRec.FRIENDCLSType);
  2877.         with FInfoRec.FRIENDCLSType^ do
  2878.         begin
  2879.           TypeIndex :=
  2880.             BorDebugTypeFRIENDCLS(
  2881.               Handle,
  2882.               TypeOffset);
  2883.         end;
  2884.       end;
  2885.     BORDEBUG_LF_CHAR        :
  2886.       begin
  2887.         New(FInfoRec.CHARType);
  2888.         with FInfoRec.CHARType^ do
  2889.         begin
  2890.           Value :=
  2891.             BorDebugTypeCHAR(
  2892.               Handle,
  2893.               TypeOffset);
  2894.         end;
  2895.       end;
  2896.     BORDEBUG_LF_SHORT       :
  2897.       begin
  2898.         New(FInfoRec.SHORTType);
  2899.         with FInfoRec.SHORTType^ do
  2900.         begin
  2901.           Value :=
  2902.             BorDebugTypeSHORT(
  2903.               Handle,
  2904.               TypeOffset);
  2905.         end;
  2906.       end;      
  2907.     BORDEBUG_LF_USHORT      :
  2908.       begin
  2909.         New(FInfoRec.USHORTType);
  2910.         with FInfoRec.USHORTType^ do
  2911.         begin
  2912.           Value :=
  2913.             BorDebugTypeUSHORT(
  2914.               Handle,
  2915.               TypeOffset);
  2916.         end;
  2917.       end;
  2918.     BORDEBUG_LF_LONG        :
  2919.       begin
  2920.         New(FInfoRec.LONGType);
  2921.         with FInfoRec.LONGType^ do
  2922.         begin
  2923.           Value :=
  2924.             BorDebugTypeLONG(
  2925.               Handle,
  2926.               TypeOffset);
  2927.         end;
  2928.       end;
  2929.     BORDEBUG_LF_ULONG       :
  2930.       begin
  2931.         New(FInfoRec.ULONGType);
  2932.         with FInfoRec.ULONGType^ do
  2933.         begin
  2934.           Value :=
  2935.             BorDebugTypeULONG(
  2936.               Handle,
  2937.               TypeOffset);
  2938.         end;
  2939.       end;      
  2940.     BORDEBUG_LF_REAL32      :
  2941.       begin
  2942.         New(FInfoRec.REAL32Type);
  2943.         with FInfoRec.REAL32Type^ do
  2944.         begin
  2945.           Value :=
  2946.             BorDebugTypeREAL32(
  2947.               Handle,
  2948.               TypeOffset);
  2949.         end;
  2950.       end;      
  2951.     BORDEBUG_LF_REAL64      :
  2952.       begin
  2953.         New(FInfoRec.REAL64Type);
  2954.         with FInfoRec.REAL64Type^ do
  2955.         begin
  2956.           Value :=
  2957.             BorDebugTypeREAL64(
  2958.               Handle,
  2959.               TypeOffset);
  2960.         end;
  2961.       end;      
  2962.     BORDEBUG_LF_REAL80      :
  2963.       begin
  2964.         New(FInfoRec.REAL80Type);
  2965.         with FInfoRec.REAL80Type^ do
  2966.         begin
  2967.           Value :=
  2968.             BorDebugTypeREAL80(
  2969.               Handle,
  2970.               TypeOffset);
  2971.         end;
  2972.       end;      
  2973.     BORDEBUG_LF_QUADWORD    :
  2974.       begin
  2975.         New(FInfoRec.QUADWORDType);
  2976.         with FInfoRec.QUADWORDType^ do
  2977.         begin
  2978.           Value :=
  2979.             BorDebugTypeQUADWORD(
  2980.               Handle,
  2981.               TypeOffset);
  2982.         end;
  2983.       end;      
  2984.     BORDEBUG_LF_UQUADWORD   :
  2985.       begin
  2986.         New(FInfoRec.UQUADWORDType);
  2987.         with FInfoRec.UQUADWORDType^ do
  2988.         begin
  2989.           Value :=
  2990.             BorDebugTypeUQUADWORD(
  2991.               Handle,
  2992.               TypeOffset);
  2993.         end;
  2994.       end;
  2995.     BORDEBUG_LF_REAL48      :
  2996.       begin
  2997.         New(FInfoRec.REAL48Type);
  2998.         with FInfoRec.REAL48Type^ do
  2999.         begin
  3000.           Value :=
  3001.             BorDebugTypeREAL48(
  3002.               Handle,
  3003.               TypeOffset);
  3004.         end;
  3005.       end;
  3006.    end;
  3007. end;
  3008.  
  3009. destructor TTypeInfo.Destroy;
  3010. begin
  3011.   case TypeKind of
  3012.     BORDEBUG_LF_MODIFIER    :
  3013.       begin
  3014.         Dispose(FInfoRec.MODIFIERType);
  3015.       end;
  3016.     BORDEBUG_LF_POINTER     :
  3017.       begin
  3018.         Dispose(FInfoRec.POINTERType);
  3019.       end;
  3020.     BORDEBUG_LF_ARRAY       :
  3021.       begin
  3022.         Dispose(FInfoRec.ARRAYType);
  3023.       end;
  3024.     BORDEBUG_LF_STRUCT,
  3025.     BORDEBUG_LF_CLASS       :
  3026.       begin
  3027.         Dispose(FInfoRec.CLASSType);
  3028.       end;
  3029.     BORDEBUG_LF_UNION       :
  3030.       begin
  3031.         Dispose(FInfoRec.UNIONType);
  3032.       end;
  3033.     BORDEBUG_LF_ENUM        :
  3034.       begin
  3035.         Dispose(FInfoRec.ENUMType);
  3036.       end;
  3037.     BORDEBUG_LF_PROCEDURE   :
  3038.       begin
  3039.         Dispose(FInfoRec.PROCEDUREType);
  3040.       end;
  3041.     BORDEBUG_LF_MFUNCTION   :
  3042.       begin
  3043.         Dispose(FInfoRec.MFUNCTIONType);
  3044.       end;
  3045.     BORDEBUG_LF_VTSHAPE     :
  3046.       begin
  3047.         FreeMem(FInfoRec.VTSHAPEType^.DescriptorArray);
  3048.         Dispose(FInfoRec.VTSHAPEType);
  3049.       end;
  3050.     BORDEBUG_LF_LABEL       :
  3051.       begin
  3052.         Dispose(FInfoRec.LABELType);
  3053.       end;
  3054.     BORDEBUG_LF_SET         :
  3055.       begin
  3056.         Dispose(FInfoRec.SETType);
  3057.       end;
  3058.     BORDEBUG_LF_SUBRANGE    :
  3059.       begin
  3060.         Dispose(FInfoRec.SUBRANGEType);
  3061.       end;
  3062.     BORDEBUG_LF_PARRAY      :
  3063.       begin
  3064.         Dispose(FInfoRec.PARRAYType);
  3065.       end;
  3066.     BORDEBUG_LF_PSTRING     :
  3067.       begin
  3068.         Dispose(FInfoRec.PSTRINGType);
  3069.       end;
  3070.     BORDEBUG_LF_CLOSURE     :
  3071.       begin
  3072.         Dispose(FInfoRec.CLOSUREType);
  3073.       end;
  3074.     BORDEBUG_LF_PROPERTY    :
  3075.       begin
  3076.         Dispose(FInfoRec.PROPERTYType);
  3077.       end;
  3078.     BORDEBUG_LF_LSTRING     :
  3079.       begin
  3080.         Dispose(FInfoRec.LSTRINGType);
  3081.       end;
  3082.     BORDEBUG_LF_VARIANT     :
  3083.       begin
  3084.         Dispose(FInfoRec.VARIANTType);
  3085.       end;
  3086.     BORDEBUG_LF_CLASSREF    :
  3087.       begin
  3088.         Dispose(FInfoRec.CLASSREFType);
  3089.       end;
  3090.     BORDEBUG_LF_WSTRING     :
  3091.       begin
  3092.         Dispose(FInfoRec.WSTRINGType);
  3093.       end;
  3094.     BORDEBUG_LF_ARGLIST     :
  3095.       begin
  3096.         FreeMem(FInfoRec.ARGLISTType^.TypeArray);
  3097.         Dispose(FInfoRec.ARGLISTType);
  3098.       end;
  3099.     BORDEBUG_LF_DERIVED     :
  3100.       begin
  3101.         FreeMem(FInfoRec.DERIVEDType^.DerivedTypes);
  3102.         Dispose(FInfoRec.DERIVEDType);
  3103.       end;
  3104.     BORDEBUG_LF_BITFIELD    :
  3105.       begin
  3106.         Dispose(FInfoRec.BITFIELDType);
  3107.       end;
  3108.     BORDEBUG_LF_METHODLIST  :
  3109.       begin
  3110.         FreeMem(FInfoRec.METHODLISTType^.TypeArray);
  3111.         FreeMem(FInfoRec.METHODLISTType^.AttribArray);
  3112.         FreeMem(FInfoRec.METHODLISTType^.BrowserArray);
  3113.         FreeMem(FInfoRec.METHODLISTType^.VtabOffArray);
  3114.         Dispose(FInfoRec.METHODLISTType);
  3115.       end;
  3116.     BORDEBUG_LF_BCLASS      :
  3117.       begin
  3118.         Dispose(FInfoRec.BCLASSType);
  3119.       end;
  3120.     BORDEBUG_LF_VBCLASS     :
  3121.       begin
  3122.         Dispose(FInfoRec.VBCLASSType);
  3123.       end;
  3124.     BORDEBUG_LF_IVBCLASS    :
  3125.       begin
  3126.         Dispose(FInfoRec.IVBCLASSType);
  3127.       end;
  3128.     BORDEBUG_LF_ENUMERATE   :
  3129.       begin
  3130.         Dispose(FInfoRec.ENUMERATEType);
  3131.       end;
  3132.     BORDEBUG_LF_FRIENDFCN   :
  3133.       begin
  3134.         Dispose(FInfoRec.FRIENDFCNType);
  3135.       end;
  3136.     BORDEBUG_LF_INDEX       :
  3137.       begin
  3138.         Dispose(FInfoRec.INDEXTypeR);
  3139.       end;
  3140.     BORDEBUG_LF_MEMBER      :
  3141.       begin
  3142.         Dispose(FInfoRec.MEMBERType);
  3143.       end;
  3144.     BORDEBUG_LF_STMEMBER    :
  3145.       begin
  3146.         Dispose(FInfoRec.STMEMBERType);
  3147.       end;
  3148.     BORDEBUG_LF_METHOD      :
  3149.       begin
  3150.         Dispose(FInfoRec.METHODType);
  3151.       end;
  3152.     BORDEBUG_LF_NESTTYPE    :
  3153.       begin
  3154.         Dispose(FInfoRec.NESTTYPEType);
  3155.       end;
  3156.     BORDEBUG_LF_VFUNCTAB    :
  3157.       begin
  3158.         Dispose(FInfoRec.VFUNCTABType);
  3159.       end;
  3160.     BORDEBUG_LF_FRIENDCLS   :
  3161.       begin
  3162.         Dispose(FInfoRec.FRIENDCLSType);
  3163.       end;
  3164.     BORDEBUG_LF_CHAR        :
  3165.       begin
  3166.         Dispose(FInfoRec.CHARType);
  3167.       end;
  3168.     BORDEBUG_LF_SHORT       :
  3169.       begin
  3170.         Dispose(FInfoRec.SHORTType);
  3171.       end;
  3172.     BORDEBUG_LF_USHORT      :
  3173.       begin
  3174.         Dispose(FInfoRec.USHORTType);
  3175.       end;
  3176.     BORDEBUG_LF_LONG        :
  3177.       begin
  3178.         Dispose(FInfoRec.LONGType);
  3179.       end;
  3180.     BORDEBUG_LF_ULONG       :
  3181.       begin
  3182.         Dispose(FInfoRec.ULONGType);
  3183.       end;
  3184.     BORDEBUG_LF_REAL32      :
  3185.       begin
  3186.         Dispose(FInfoRec.REAL32Type);
  3187.       end;
  3188.     BORDEBUG_LF_REAL64      :
  3189.       begin
  3190.         Dispose(FInfoRec.REAL64Type);
  3191.       end;
  3192.     BORDEBUG_LF_REAL80      :
  3193.       begin
  3194.         Dispose(FInfoRec.REAL80Type);
  3195.       end;
  3196.     BORDEBUG_LF_QUADWORD    :
  3197.       begin
  3198.         Dispose(FInfoRec.QUADWORDType);
  3199.       end;
  3200.     BORDEBUG_LF_UQUADWORD   :
  3201.       begin
  3202.         Dispose(FInfoRec.UQUADWORDType);
  3203.       end;
  3204.     BORDEBUG_LF_REAL48      :
  3205.       begin
  3206.         Dispose(FInfoRec.REAL48Type);
  3207.       end;
  3208.   end;
  3209.   // We could have avoided all the Dispose-calls above by doing:
  3210.   //
  3211.   // FreeMem(FInfoRec.TypePtr)
  3212.   //
  3213.   // But if we later add strings, variants, interfaces or other auto-managed
  3214.   // fields that must be finalized, the code would break (i.e. leak)
  3215.   FInfoRec.TypePtr := nil;
  3216.   inherited Destroy;
  3217. end;
  3218.  
  3219. function TTypeInfo.GetNameIndex: TNameIndex;
  3220. begin
  3221.   case TypeKind of
  3222.     BORDEBUG_LF_ARRAY       : Result := FInfoRec.ARRAYType^.NameIndex;
  3223.     BORDEBUG_LF_STRUCT,
  3224.     BORDEBUG_LF_CLASS       : Result := FInfoRec.CLASSType^.NameIndex;
  3225.     BORDEBUG_LF_UNION       : Result := FInfoRec.UNIONType^.NameIndex;
  3226.     BORDEBUG_LF_ENUM        : Result := FInfoRec.ENUMType^.NameIndex;
  3227.     BORDEBUG_LF_SET         : Result := FInfoRec.SETType^.NameIndex;
  3228.     BORDEBUG_LF_SUBRANGE    : Result := FInfoRec.SUBRANGEType^.NameIndex;
  3229.     BORDEBUG_LF_PARRAY      : Result := FInfoRec.PARRAYType^.NameIndex;
  3230.     BORDEBUG_LF_PSTRING     : Result := FInfoRec.PSTRINGType^.NameIndex;
  3231.     BORDEBUG_LF_LSTRING     : Result := FInfoRec.LSTRINGType^.NameIndex;
  3232.     BORDEBUG_LF_VARIANT     : Result := FInfoRec.VARIANTType^.NameIndex;
  3233.     BORDEBUG_LF_WSTRING     : Result := FInfoRec.WSTRINGType^.NameIndex;
  3234.     BORDEBUG_LF_ENUMERATE   : Result := FInfoRec.ENUMERATEType^.NameIndex;
  3235.     BORDEBUG_LF_FRIENDFCN   : Result := FInfoRec.FRIENDFCNType^.NameIndex;
  3236.     BORDEBUG_LF_MEMBER      : Result := FInfoRec.MEMBERType^.NameIndex;
  3237.     BORDEBUG_LF_STMEMBER    : Result := FInfoRec.STMEMBERType^.NameIndex;
  3238.     BORDEBUG_LF_METHOD      : Result := FInfoRec.METHODType^.NameIndex;
  3239.     BORDEBUG_LF_NESTTYPE    : Result := FInfoRec.NESTTYPEType^.NameIndex;
  3240.     else                      Result := -1;
  3241.   end;
  3242. end;
  3243.  
  3244. function TTypeInfo.GetKindAsString: string;
  3245. begin
  3246.   Result := TypeKindToString(TypeKind);
  3247. end;
  3248.  
  3249. end.
  3250.